建立日期: 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 協議》,轉載必須註明作者和本文連結