1. 程式人生 > >正則表示式(re模組)

正則表示式(re模組)

正則表示式

re.match函式

  • 嘗試從字串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none
  • >re.match(pattern, string, flags=0)

re.search方法

  • 掃描整個字串並返回第一個成功的匹配。
  • >re.search(pattern, string, flags=0)

re.match與re.search的區別

re.match只匹配字串的開始,如果字串開始不符合正則表示式,則匹配失敗,函式返回None;而re.search匹配整個字串,直到找到一個匹配。

re.findall 方法

  • 在字串中找到正則表示式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。
  • >re.findall(pattern,string,flags=0)

flags 標誌位,用於控制正則表示式的匹配方式,如:是否區分大小寫,多行匹配等等

‘(?P…)’ 分組匹配

  • 例:身份證 1102231990xxxxxxxx
import re
s = '1102231990xxxxxxxx'
res = re.search('(?P<province>\d{3})(?P<city>\d{3})(?P<born_year>\d{3})',s)
print(res.groupdict())
# 此分組取出結果為:
{'province': '110'
, 'city': '223', 'born_year': '199'} # 直接將匹配結果直接轉為字典模式,方便使用。

零寬斷言

import re
str = '我的個人部落格地址是stuzar.github.io,個人郵箱是[email protected],個人QQ是xxxxxxx'
  • ?= 代表零寬度正預測先行斷言,它斷言自身出現的位置的後面可以匹配後面跟的表示式。
result = re.search('我的個人部落格地址是(.*?)(?=,個人郵箱)', str)
print('整句結果:' + result.group(), '第一個匹配結果:' + result.
group(1), sep='\n') # ----> 整句結果:我的個人部落格地址是stuzar.github.io # ----> 第一個匹配結果:stuzar.github.io
  • ?<= 代表零寬度正回顧後發斷言,它斷言自身出現的位置的前面可以匹配後面跟的表示式。(其實就是匹配前面的標識)
result = re.search('(?<=,)個人郵箱是(.*?)(?=,)', str)
print('整句結果:' + result.group(), '第一個匹配結果:' + result.group(1), sep='\n')
# ----> 整句結果:個人郵箱是[email protected]
# ----> 第一個匹配結果:[email protected]
  • ?! 代表零寬度負預測先行斷言,它斷言自身出現的位置的後面不可以匹配後面跟的表示式。(用來匹配後面的文字,但這裡是取反,它指定了後面出現的內容不匹配該標識)
result = re.search('我的個人部落格地址是(.*?)(?!,個人QQ是xxxxxxx)(?=,個人郵箱)', str)
print('整句結果:' + result.group(), '第一個匹配結果:' + result.group(1), sep='\n')
# ----> 整句結果:我的個人部落格地址是stuzar.github.io
# ----> 第一個匹配結果:stuzar.github.io
  • ?<! 代表零寬度負回顧後發斷言,它斷言自身出現的位置的後面不可以匹配後面跟的表示式。
result = re.search('(?<=,)(?<!。)個人郵箱是(.*?)(?=,)', str)
print('整句結果:' + result.group(), '第一個匹配結果:' + result.group(1), sep='\n')
# ----> 整句結果:個人郵箱是[email protected]
# ----> 第一個匹配結果:[email protected]
  • 常用findall()方法匹配多個結果
results = re.findall('個人(.*?)是(.*?)(?=,|\Z)', str)
for result in results:
    print(result[0] + ': ' + result[1])
# ----> 部落格地址: stuzar.github.io
# ----> 郵箱: [email protected]
# ----> QQ: xxxxxxx

查詢

正則表示式修飾符 - 可選標誌

  • 正則表示式可以包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定為一個可選的標誌。
  • 多個標誌可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設定成 I 和 M 標誌
修飾符 描述
re.I 使匹配對大小寫不敏感
re.L 做本地化識別(locale-aware)匹配
re.M 多行匹配,影響 ^ 和 $
re.S 使 . 匹配包括換行在內的所有字元
re.U 根據Unicode字符集解析字元。這個標誌影響 \w, \W, \b, \B.
re.X 該標誌通過給予你更靈活的格式以便你將正則表示式寫得更易於理解。

正則表示式模式

模式 描述
^ 匹配字串的開頭
$ 匹配字串的末尾。
. 匹配任意字元,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字元。
[…] 用來表示一組字元,單獨列出:[amk] 匹配 ‘a’,‘m’或’k’
[^…] 不在[]中的字元:[^abc] 匹配除了a,b,c之外的字元。
re* 匹配0個或多個的表示式。
re+ 匹配1個或多個的表示式。
re? 匹配0個或1個由前面的正則表示式定義的片段,非貪婪方式
re{ n} 精確匹配 n 個前面表示式。例如, o{2} 不能匹配 “Bob” 中的 “o”,但是能匹配 “food” 中的兩個 o。
re{ n,} 匹配 n 個前面表示式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。“o{1,}” 等價於 “o+”。“o{0,}” 則等價於 “o*”。
re{ n, m} 匹配 n 到 m 次由前面的正則表示式定義的片段,貪婪方式
a\b 匹配a或b
(re) 匹配括號內的表示式,也表示一個組
(?#…) 註釋.
\w 匹配字母數字及下劃線
\W 匹配非字母數字及下劃線
\s 匹配任意空白字元,等價於 [\t\n\r\f].
\S 匹配任意非空字元
\d 匹配任意數字,等價於 [0-9].
\D 匹配任意非數字
\A 匹配字串開始
\Z 匹配字串結束,如果是存在換行,只匹配到換行前的結束字串。
\z 匹配字串結束
\G 匹配最後匹配完成的位置。
\b 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B 匹配非單詞邊界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\n, \t, 匹配一個換行符。匹配一個製表符。