1'.'預設匹配除\n之外的任意乙個字元,若指定flag dotall,則匹配任意字元,包括換行2'
^' 匹配字元開頭,若指定flags multiline,這種也可以匹配上(r"
^a","
\nabc\neee
",flags=re.multiline)3'
$' 匹配字元結尾,或e.search("
foo$
","bfoo\nsdfsf
",flags=re.multiline).group()也可以4'
*' 匹配*號前的字元0次或多次,re.findall("
ab*","
cabb3abcbbac
") 結果為['
abb', '
ab', 'a'
]5'+
' 匹配前乙個字元1次或多次,re.findall("
ab+","
ab+cd+abb+bba
") 結果['
ab', '
abb']6
'?'匹配前乙個字元1次或0次7'
'匹配前乙個字元m次8'
' 匹配前乙個字元n到m次,re.findall("
ab","
abb abc abbcbbb
") 結果'
abb', '
ab', '
abb']9
'|' 匹配|左或|右的字元,re.search("
abc|abc
","abcbabccd
").group() 結果'
abc'10'
(...)
' 分組匹配,re.search("
(abc)a(123|456)c
", "
abcabca456c
").group() 結果 abcabca456c
111213'
\a' 只從字元開頭匹配,re.search("
\aabc
","alexabc
") 是匹配不到的14'
\z'匹配字元結尾,同$15'
\d' 匹配數字0-916'
\d'匹配非數字17'
\w' 匹配[a-za-z0-9]18'
\w' 匹配非[a-za-z0-9]19'
s' 匹配空白字元、\t、\n、\r , re.search("
\s+","
ab\tc1\n3
").group() 結果 '\t'
2021
'(?p...)
' 分組匹配 re.search("
(?p[0-9])(?p[0-9])(?p[0-9])
","371481199306143242
").groupdict("
city
") 結果
最常用的匹配語法
1re.match 從頭開始匹配
2re.search 匹配包含
3re.findall 把所有匹配到的字元放到以列表中的元素返回
4re.splitall 以匹配到的字元當做列表分隔符
5 re.sub 匹配字元並替換
反斜槓的困擾
與大多數程式語言相同,正規表示式裡使用"\"作為轉義字元,這就可能造成反斜槓困擾。假如你需要匹配文字中的字元"\",那麼使用程式語言表示的正規表示式裡將需要4個反斜槓"\\\\":前兩個和後兩個分別用於在程式語言裡轉義成反斜槓,轉換成兩個反斜槓後再在正規表示式裡轉義成乙個反斜槓。python裡的原生字串很好地解決了這個問題,這個例子中的正規表示式可以使用r"\\"表示。同樣,匹配乙個數字的"\\d"可以寫成r"\d"。有了原生字串,你再也不用擔心是不是漏寫了反斜槓,寫出來的表示式也更直觀。
幾個匹配模式
1re.i(re.ignorecase): 忽略大小寫(括號內是完整寫法,下同)
2 m(multiline): 多行模式,改變'
^'和'$'
的行為(參見上圖)
3 s(dotall): 點任意匹配模式,改變'
.'的行為
正規表示式符號
字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
正規表示式符號
字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...
正規表示式符號
字元 描述 標記下乙個字元是特殊字元或文字。例如,n 和字元 n 匹配。n 則和換行字元匹配。序列 和 匹配,而 則和 匹配。匹配輸入的開頭。匹配輸入的末尾。匹配前乙個字元零或多次。例如,zo 與 z 或 zoo 匹配。匹配前乙個字元一次或多次。例如,zo 與 zoo 匹配,但和 z 不匹配。匹配前...