網上的相關資料非常多,但都很亂。於是我做了個分類,一來自己方便查看,二來看到此文章的同仁也能省去些麻煩。
提示:正則表達式中的 pattern 參數通常都包含反斜線,為了防止它們被識別為轉義字符,最好使用原始字符串 r''
來表示它們。(如 r'\t'
,等價於 \\t
) 匹配相應的特殊字符。
使用原始字符串的優點是可以少寫\
號,代碼閱讀起來也更容易些。
正則表達式四大功能:匹配 (bool 值)、獲取、替換、分割。
匹配單個字符#
- . :表示任意一個字符。如表達式
't.o'
,too
或'two'
都符合條件。 - [...]:匹配 [] 中列舉的所有字符中的一個。
- 一個 [] 表示一個字符:
[amk]
匹配 'a','m' 或 'k'。[a-zA-Z0-9]
表示所有字母 + 數字。[A-Z][a-z]
表示第一個字符為大寫字母,第二個字符為小寫字符,即兩個字符。 - 注意無需使用
,
分割內容,[0-35-9]
表示 0~3 與 5~9。 - 可以用
-
給出範圍。如[abc]
和[a-c]
含義相同。
- 一個 [] 表示一個字符:
- [^...]:不在 [] 中的字符中的一個。
[^abc]
匹配除了 a,b,c 之外的字符。
匹配單個字符 —— 它們可以寫在字符集 [] 中#
- \w: 匹配數字字母下劃線。等價於
[a-zA-Z0-9_]
,在 Unicode 字符中還可以匹配漢字、全角數字。 - \W:匹配非數字字母下劃線,等價於
[^A-Za-z0-9_]
。 - \s:匹配任意空白字符、空格、tab 鍵。等價於
[\t\n\r\f]
。 - \S:匹配任意非空字符,等價於
[^\t\n\r\f]
。 - \d:匹配任意數字,等價於
[0-9]
。 - \D:匹配任意非數字,等價於
[^0-9]
。
匹配多個字符#
- *:匹配 * 號前一個字符出現至少 0 次的表達式。如表達式
abc*
,匹配值ab
,abccc
。 - +:匹配前⼀個字符出現 1 次或者⽆限次。如表達式
abc+
,匹配值abc
,abccc
。 - ?:匹配前⼀個字符出現 1 次或者 0 次,即要么有 1 次,要么沒有。非貪婪。
- {m}:匹配前⼀個字符出現 m 次。如表達式
ab{2}c
,匹配值abbc
。 - {m,}:匹配前面表達式至少 m 次
- {,n}:匹配前面的正則表達式最多 n 次
- {m,n}:匹配前⼀個字符出現至少 m 至多 n 次。如表達式
ab{1,3}c
,匹配值abc
,abbc
,abbbc
。
特殊匹配#
- | :匹配左右任意一個表達式。如匹配 0-100 之間的數字,表達式
re.match(r'[1-9]?\d$|100',string)
。 - ():匹配括號內的表達式,也可表示一個組 (整體),組與組之間聯合使用。可以和
|
搭配,如識別郵箱時(163|126|qq)
。 - \b:匹配單詞邊界。
\b
是零寬度不占字符的,它是一個邊界線的存在,在\b
的左右兩側,要求一個是\w
,一個是\W
。- 也就是用於匹配處在邊界的字符,比如
\bhe
可以匹配 "he" 但不能匹配 "where"。 \bman\b
可以匹配 "I am a man, not a woman" 中的man
,而不會匹配woman
;但man\b
會匹配出man
和woman
,因為後者的 "man" 也處在邊界,使用時要注意。
- \B:匹配非單詞邊界。
- 和
\b
相反,這樣理解:在\B
的左右兩側,要么全是\w
,要么全是\W
。 - 如
py=\B
可以匹配 "py==" 中的 "py=",但不能匹配 "py=1" 中的 "py="。
- 和
- \n,\t,等:匹配一個換行符,匹配一個制表符,等。
位置類#
- ^:匹配字符串的開頭。
- $:匹配字符串的末尾。
- 實例:
re.match(r'[\w]{4,20}@163\.com$','[email protected]')
- 可搭配組使用。
- 實例:
- \A:匹配字符串開始。
- \Z:匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。
- \z:匹配字符串結束。
- \G:匹配最後匹配完成的位置。
實例#
- [Pp] ython:匹配 "Python" 或 "python"
- rub [ye]:匹配 "ruby" 或 "rube"
- [aeiou]:匹配中括號內的任意一個字母
- [0-9]:匹配任何數字。類似於 [0123456789]
- [a-z]:匹配任何小寫字母
- [A-Z]:匹配任何大寫字母
- [a-zA-Z0-9]:匹配任何字母及數字
- [^aeiou]:除了 aeiou 字母以外的所有字符
- [^0-9]:匹配除了數字外的字符
*:星號。匹配前一個字符 0 到 n 次,如'pytho\*n'
可以匹配 pythn、pythoon、pythooooon 等。還有其它匹配重複字符的如?、+ 或 {m,n},其中 {n,m} 可以靈活使用,它表示匹配 n 次到 m 次。
\b 的用法也可以很靈活,在給定的字符串中,找到以小寫字母開頭的單詞。
ss = "i Am a gOod boy baby!!"
result=re.findall(r'\b[a-z][a-zA-Z]*\b',ss)
print(result)