正則式 REGEX - Python re library

Jason990420發表於2021-12-10

建立日期: 2021/12/10
修改日期: None

平臺

  • WIN10
  • Python 3.9.9

基本常識

  • 字串 str 和 位元組 bytes 不可以混用
  • 正則式使用與 Python 同樣的脫離字元, 所以儘可能使用原始字串 (raw string) 來代表正則式 r’…’

特殊字母

特殊字元 含義
. 沒 re.DOTALL, 代表任意字母, 不包含換行字母 (‘\n’).
有 re.DOTALL, 代表任意字母, 也包含換行字母 (‘\n’).
^ 沒 re.MULTILINE, 代表字串的開始處.
有 re.MULTILINE, 代表字串的每一行的開始處.
$ 沒 re.MULTILINE, 代表字串的結束處或最後為換行字母 (‘\n’) 前處.
有 re.MULTILINE, 代表字串的每一行的結束處或換行字母 (‘\n’) 前處.
* 匹配前一項內容零次以上, 該項為貪婪匹配 (greedy), 儘可能匹配更多次的.
比如使用 r’<.*>’ 來匹配字串 ‘<abc><abc>’, 會得到 ‘<abc><abc>’, 而不是 ‘<abc>’.
+ 匹配前一項內容一次以上, 該項為貪婪匹配, 儘可能匹配更多次的.
? 匹配前一項內容零次或一次, 該項為貪婪匹配, 儘可能匹配更多次的.
*?, +?, ?? 改變匹配次數的方式為非貪婪匹配 (non-greedy), 儘可能匹配較少次的.
比如使用 r’<.*?>’ 來匹配字串 ‘<abc><abc>’, 會得到 ‘<abc>’, 而不是 ‘<abc><abc>’.
{m,n} 匹配前一項內容至少 m 次以上, 至多 n 次, 該項為貪婪匹配, 儘可能匹配更多次的, 如果 m 或 n 省略, 則等同 0 或 無窮大.
{m,n}? 改變匹配次數的方式為非貪婪匹配, 儘可能匹配較少次的.
\ 脫離字元, 將特殊字元改為一般字元, 或者某些特殊的用詞.
[ ] 字符集, 指定所有可以匹配字元的單一字元, 如十六進位數字 [0123456789abcdefABCDEF].
如果兩字元中間加上 ‘-‘, 代表一個連續的範圍, 如十六進位數字 [0-9a-zA-Z].
特殊字元在這裡將代表一般的字元.
字元類可以在這裡使用.
[^ ] 字符集, 指定不匹配的字符集.
| 匹配左邊的, 如果不匹配, 再匹配右邊的, 相當於 “或”.
( ) 定義某一區塊的匹配為一個群組, 該群組可以 \編號 在正則式中代表匹配相同的內容, 編號從1開始, 最大為99.
(? ) 代表一種擴充的功能, ? 後面的第一個字元代表其功能, 除了 (?P…) 以外, 這不是一個群組
(?aiLmsux) 設定各項設定, 應該放在正規表示式最前面, 每個文字對應的是 re.A, re.I, re.L, re.M, re.S, re.U, re.X 設定
(?: ) 代表以括號分隔的一個群組, 不過這個群組不能被引用, 也不能在匹配後被獲取
(?aiLmsux-imsx: ) 設定或移除各項設定
(?P<name>) 設定群組的匹配, 並以 name 為該群組名稱, 可以使用 (?P=name), \編號 來引用, 在取代的字串時, 可以用 \g<name>, \g<1>, \1 來引用
(?P=name) 引用該名稱的群組, 以匹配相同的內容
(?# ) 註解
(?= ) positive lookahead assertion 先行斷言, 如果後面也匹配才會匹配, 其本身並不消耗任何字串
(?! ) negative lookahead assertion 前瞻斷言, 如果後面不匹配才會匹配, 其本身並不消耗任何字串
(?<= ) positive lookbehind assertion 正面回顧斷言, 如果前面也匹配才會匹配, 必須使用固定長度的內容
(?<! ) negative lookbehind assertion 否定回顧斷言, 如果前面不匹配才會匹配, 必須使用固定長度的內容
(?(id/name)
yes-pattern
|no-pattern)
如果該群組有匹配到, 使用 yes-pattern 來匹配, 否則使用 no-pattern, 後者可以省略
\編號 引用該編號的群組, 以匹配相同的內容
\A 字串的起點
\b 匹配空字串, 指的是字的前後, 或在字與字的間隔
\B 匹配空字串, 但不在字的前後, 或不在字與字的間隔
\d 匹配任何十進位制數字符 [0-9]
\D 匹配任何非十進位制數字符 [^0-9]
\s 匹配任何空白字元 [ \t\n\r\f\v]
\S 匹配任何非空白字元 [^ \t\n\r\f\v]
\w 匹配任何字母, 數字和下劃線 [a-zA-Z0-9_]
\W 匹配任何非字母數字和下劃線 [^a-zA-Z0-9_]
\Z 字串的終點

正則式中的各項設定

設定 正則式設定 說明
re.A
re.ASCII
(?a) 對 \w, \W, \b, \B, \d, \D, \s, \S 只匹配 ASCII 字元
re.U
re.UNICODE
(?u) 對 \w, \W, \b, \B, \d, \D, \s, \S 可匹配 UNICODE 字元 (Python 3 中已經沒必要使用)
re.I
re.IGNORECASE
(?i) 大小寫字母視為相同
re.L
re.LOCALE
(?L) 對 \w, \W, \b, \B, 大小寫不同, 視當前語言環境而定, 該標誌只適用於位元組正則式, 不建議使用, 因為使用當前語言環境機制是很不可靠的.
re.M
re.MULTILINE
(?m) 對 ‘^’, ‘$’ 字串的開頭及末尾匹配模式, 改為多行的各行匹配模式
re.S
re.DOTALL
(?s) 對 ‘.’ 的除換行符外匹配任意字元模式, 改為全部都匹配模式
re.X
re.VERBOSE
(?x) 對正則式的格式, 可以隨意編排;
除了在集合字元中,或者在前面加上未轉義的反斜槓時, 或*?, (?:, (?P< > 之中, 其他的空白字元都會被勿略, 可以加空格, 換行, 加 # 後面變註解
re.DEBUG 顯示有關編譯表示式的除錯資訊.

正則式的函式及正則式物件的方法

經編譯生成的正則式的物件, 可以重複使用, 也更有效率, 並且提供引數 flags 以利各項設定, 設定之間使用 Python 的 | (OR) 運運算元以合併使用.

import re

regex = re.compile(pattern, flags=0)
正則式的函式
正則式物件的方法
說明
re.search(pattern, string, flags=0)
regex.search(string[, pos[, endpos]])
在 string 中, 找到第一個匹配 pattern 的位置, 匹配時返回一個 match 物件, 無法匹配則返回 None
re.match(pattern, string, flags=0)
regex.match(string[, pos[, endpos]])
在 string 中, pattern 的匹配位置必須是 string 的開頭, 匹配時返回一個 match 物件, 無法匹配則返回 None
re.fullmatch(pattern, string, flags=0)
regex.fullmatch(string[, pos[, endpos]])
string 要完全匹配 pattern, 匹配時返回一個 match 物件, 無法匹配則返回 None
re.split(pattern, string, maxsplit=0, flags=0)
regex.split(string, maxsplit=0)
以匹配 pattern 的每一段子字串來分割字串 string, 非零整 maxsplit 為最多分割次數數 , 為零則全部分割, 所有的群組都會在輸出的列表中
re.findall(pattern, string, flags=0)
regex.findall(string[, pos[, endpos]])
不重疊的所有匹配的子字串, 無群組, 返回字串的列表, 單一群組, 返回群組字串的列表, 多群組則返回字串元組的列表, 沒有匹配的則返回空列表
re.finditer(pattern, string, flags=0)
regex.finditer(string[, pos[, endpos]])
不重疊的所有匹配 match 物件迭代器
re.sub(pattern, repl, string, count=0, flags=0)
regex.sub(repl, string, count=0)
在 string 不重疊的所有匹配, 以 repl 取代前面的 count 個, count 為 0 代表全部取代, 返回替換後的字串
repl 可以是字串, 其中反斜線的脫離動作會被引用, 特別是代表某個群組的, 如 \2 或 \g<2>
repl 可以是函式, 傳入匹配物件, 返回供替換的字串
re.subn(pattern, repl, string, count=0, flags=0)
regex.subn(repl, string, count=0)
類似 re.sub, 但返回一個串元組 (替換後的字串, 替換的次數)
re.escape(pattern) 替換一般的字串為帶有脫離字元的正則式字串, 不適用於 repl 的字串
re.purge() 清除正則式的快取
regex.flags 正則式的匹配旗標
regex.groups 在 pattern 中所找到的群數
regex.groupindex 符號群名(?P<id>)對應到群編號的字典
regex.pattern 正則式的 pattern
re.error(msg, pattern=None, pos=None) exception 的相關屬性
- msg 未格式化的錯誤訊息
- pattern 正則式的 pattern
- pos 在 pattern 中, 錯誤的位置索引, 有可能是 None
- lineno 對應 pos 中的行號, 有可能是 None
- colno 對應 pos 中的列號, 有可能是 None

Match 物件的屬性

屬性 說明
group([group1, …]) 返回匹配的字串, 或匹配群組的 tuple; 沒有引數, 視為0, 返回全部匹配的字串; 如果某一個引數為0, 則該部份返回全部匹配的字串; 如果為負數或大於最大的群組數, 會產生 IndexError; 如果某群組沒有匹配, 則返回 None; 如果該群組被匹配多次, 則返回最後一個; 也可以使用群組名.
__getitem__(g) 可以使用索引的方式, 返回單一群組匹配的結果
groups(default=None) 返回全部匹配群組的 tuple; default 指定沒有匹配到的群組預設值.
groupdict(default=None) 返回群組名對應匹配結果的字典; default 指定沒有匹配到的群組預設值.
start([group])
end([group])
返回群組匹配的字串索引, 沒有匹配到則返回 -1; group 預設為 0, 指全部匹配的最前和最後的索引; ; 如果為負數或大於最大的群組數, 會產生 IndexError.
span([group]) 返回 (m.start(group), m.end(group))
pos 匹配被設定的索引起點
endpos 匹配被設定的索引終點
lastindex 最終被匹配的群組索引, 沒有匹配的則返回 None
lastgroup 最終被匹配的群組名, 沒有匹配的群組名則返回 None
re 正則式的物件
string 進行匹配的字串
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章