正則表達式是一個特殊的字符序列,它使用模式中的特殊語法幫助您匹配或查找其他字符串或字符串集。正則表達式在 UNIX 世界中被廣泛使用。
Python 模塊re完全支持 Python 中的類 Perl 正則表達式。如果在編譯或使用正則表達式時發生錯誤,re 模塊會引發異常 re.error。
我們將介紹兩個重要的函數,它們將用于處理正則表達式。但首先要說一件小事:有各種各樣的字符,當它們用于正則表達式時會有特殊的含義。為避免在處理正則表達式時出現任何混淆,我們將使用原始字符串作為r'expression'。
匹配函數_
此函數嘗試將 RE模式匹配到帶有可選標志的字符串。
這是此函數的語法 -
re.match(pattern, string, flags=0)
這是參數的描述 -
編號 參數及說明
1
圖案
這是要匹配的正則表達式。
2
細繩
這是字符串,它將被搜索以匹配字符串開頭的模式。
3
旗幟
您可以使用按位或 (|) 指定不同的標志。這些是修飾符,在下表中列出。
re.match函數在成功時返回匹配對象,在失敗時返回None。我們使用match對象的group(num)或groups()函數來獲取匹配的表達式。
編號 匹配對象方法和描述
1
組(數量=0)
此方法返回整個匹配(或特定子組 num)
2
組()
此方法返回元組中的所有匹配子組(如果沒有則為空)
例子
現場演示
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"
執行上述代碼時,會產生以下結果 -
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
搜索功能_
此函數使用可選標志搜索字符串中第一次出現的 RE模式。
這是此函數的語法 -
re.search(pattern, string, flags=0)
這是參數的描述 -
編號 參數及說明
1
圖案
這是要匹配的正則表達式。
2
細繩
這是字符串,它將被搜索以匹配字符串中任何位置的模式。
3
旗幟
您可以使用按位或 (|) 指定不同的標志。這些是修飾符,在下表中列出。
re.search函數在成功時返回匹配對象,在失敗時返回無。我們使用match對象的group(num)或groups()函數來獲取匹配的表達式。
編號 匹配對象方法和描述
1
組(數量=0)
此方法返回整個匹配(或特定子組 num)
2
組()
此方法返回元組中的所有匹配子組(如果沒有則為空)
例子
現場演示
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)
if searchObj:
print "searchObj.group() : ", searchObj.group()
print "searchObj.group(1) : ", searchObj.group(1)
print "searchObj.group(2) : ", searchObj.group(2)
else:
print "Nothing found!!"
執行上述代碼時,會產生以下結果 -
searchObj.group() : Cats are smarter than dogs
searchObj.group(1) : Cats
searchObj.group(2) : smarter
匹配與搜索
Python 提供了兩種不同的基于正則表達式的原始操作:match僅在字符串的開頭檢查匹配,而search在字符串中的任何位置檢查匹配(這是 Perl 默認所做的)。
例子
現場演示
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
searchObj = re.search( r'dogs', line, re.M|re.I)
if searchObj:
print "search --> searchObj.group() : ", searchObj.group()
else:
print "Nothing found!!"
執行上述代碼時,會產生以下結果 -
No match!!
search --> searchObj.group() : dogs
搜索和替換
使用正則表達式的最重要的re方法之一是sub。
句法
re.sub(pattern, repl, string, max=0)
此方法用repl替換字符串中所有出現的 RE模式,除非提供了max ,否則替換所有出現。此方法返回修改后的字符串。
例子
現場演示
#!/usr/bin/python
import re
phone = "2004-959-559 # This is Phone Number"
# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num
# Remove anything other than digits
num = re.sub(r'\D', "", phone)
print "Phone Num : ", num
執行上述代碼時,會產生以下結果 -
Phone Num : 2004-959-559
Phone Num : 2004959559
正則表達式修飾符:選項標志
正則表達式文字可能包括一個可選的修飾符來控制匹配的各個方面。修飾符被指定為可選標志。您可以使用異或 (|) 提供多個修飾符,如前所示,并且可以由以下之一表示 -
編號 修飾符和說明
1
re.I
執行不區分大小寫的匹配。
2
重L
根據當前語言環境解釋單詞。這種解釋會影響字母組(\w 和 \W),以及單詞邊界行為(\b 和 \B)。
3
再M
使 $ 匹配一行的結尾(不僅僅是字符串的結尾)并使 ^ 匹配任何行的開頭(不僅僅是字符串的開頭)。
4
回復
使句點(點)匹配任何字符,包括換行符。
5
回復
根據 Unicode 字符集解釋字母。此標志影響 \w、\W、\b、\B 的行為。
6
re.X
允許“更可愛”的正則表達式語法。它忽略空格(除了在集合 [] 內或被反斜杠轉義時)并將未轉義的 # 視為注釋標記。
正則表達式模式
除了控制字符(+ ? . * ^ $ ( ) [ ] { } | \),所有字符都匹配自己。您可以通過在控制字符前面加上反斜杠來轉義它。
下表列出了 Python 中可用的正則表達式語法 -
編號 圖案和描述
1
^
匹配行首。
2
$
匹配行尾。
3
.
匹配除換行符以外的任何單個字符。使用 m 選項也可以匹配換行符。
4
[...]
匹配括號中的任何單個字符。
5
[^...]
匹配任何不在括號中的單個字符
6
回覆*
匹配 0 次或多次出現的前面表達式。
7
重新+
匹配 1 次或多次出現的前面表達式。
8
回覆?
匹配 0 或 1 次出現的前面表達式。
9
重新{ n}
精確匹配前面表達式的 n 次出現。
10
再{n,}
匹配 n 次或多次出現的前面表達式。
11
重新{ n,米}
匹配至少 n 次和最多 m 次出現的前面表達式。
12
一個| b
匹配 a 或 b。
13
(回覆)
對正則表達式進行分組并記住匹配的文本。
14
(?imx)
臨時切換正則表達式中的 i、m 或 x 選項。如果在括號中,則只有該區域受到影響。
15
(?-imx)
暫時關閉正則表達式中的 i、m 或 x 選項。如果在括號中,則只有該區域受到影響。
16
(?: 回覆)
分組正則表達式而不記住匹配的文本。
17
(?imx:重新)
臨時切換括號內的 i、m 或 x 選項。
18
(?-imx:重新)
暫時關閉括號內的 i、m 或 x 選項。
19
(?#...)
評論。
20
(?= 重新)
使用模式指定位置。沒有范圍。
21
(?! 回覆)
使用模式否定指定位置。沒有范圍。
22
(?>重新)
匹配獨立模式而不回溯。
23
\w
匹配單詞字符。
24
\W
匹配非單詞字符。
25
\s
匹配空格。等價于 [\t\n\r\f]。
26
\S
匹配非空白。
27
\d
匹配數字。相當于 [0-9]。
28
\D
匹配非數字。
29
\一種
匹配字符串的開頭。
30
\Z
匹配字符串的結尾。如果存在換行符,它將在換行符之前匹配。
31
\z
匹配字符串的結尾。
32
\G
匹配上一場比賽結束的地點。
33
\b
在括號外匹配單詞邊界。在括號內時匹配退格 (0x08)。
34
\B
匹配非單詞邊界。
35
\n、\t 等
匹配換行符、回車符、制表符等。
36
\1...\9
匹配第 n 個分組的子表達式。
37
\10
如果已經匹配,則匹配第 n 個分組子表達式。否則指字符代碼的八進制表示。
正則表達式示例
文字字符
編號 示例和說明
1
Python
匹配“蟒蛇”。
字符類
編號 示例和說明
1
[Pp]ython
匹配“Python”或“python”
2
擦[耶]
匹配“ruby”或“ruby”
3
[愛歐]
匹配任意一個小寫元音
4
[0-9]
匹配任何數字;與 [0123456789] 相同
5
[阿茲]
匹配任何小寫 ASCII 字母
6
[AZ]
匹配任何大寫 ASCII 字母
7
[a-zA-Z0-9]
匹配以上任何一項
8
[^aeiou]
匹配除小寫元音以外的任何內容
9
[^0-9]
匹配除數字以外的任何內容
特殊字符類
編號 示例和說明
1
.
匹配除換行符以外的任何字符
2
\d
匹配一個數字:[0-9]
3
\D
匹配非數字:[^0-9]
4
\s
匹配一個空白字符:[ \t\r\n\f]
5
\S
匹配非空白:[^ \t\r\n\f]
6
\w
匹配單個單詞字符:[A-Za-z0-9_]
7
\W
匹配一個非單詞字符:[^A-Za-z0-9_]
重復案例
編號 示例和說明
1
紅寶石?
匹配“rub”或“ruby”:y 是可選的
2
紅寶石*
匹配 "rub" 加上 0 個或多個 ys
3
紅寶石+
匹配 "rub" 加上 1 個或多個 ys
4
\d{3}
精確匹配 3 位數字
5
\d{3,}
匹配 3 個或更多數字
6
\d{3,5}
匹配 3、4 或 5 位數字
非貪婪重復
這匹配最少的重復次數 -
編號 示例和說明
1
<.*>
貪婪重復:匹配“<python>perl>”
2
<.*?>
Nongreedy:匹配“<python>perl>”中的“<python>”
用括號分組
編號 示例和說明
1
\D\d+
無組:+ 重復 \d
2
(\D\d)+
分組:+ 重復 \D\d 對
3
([Pp]ython(, )?)+
匹配“Python”、“Python、python、python”等。
反向引用
這再次匹配先前匹配的組 -
編號 示例和說明
1
([Pp])ython&\1ails
匹配 python&pails 或 Python&Pails
2
(['"])[^\1]*\1
單引號或雙引號字符串。\1 匹配第一組匹配的任何內容。\2 匹配第二組匹配的任何內容,等等。
備擇方案
編號 示例和說明
1
蟒蛇|perl
匹配“python”或“perl”
2
擦(y|le))
匹配“紅寶石”或“盧布”
3
Python(!+|\?)
“Python”后跟一個或多個!還是一個?
錨點
這需要指定匹配位置。
編號 示例和說明
1
^蟒蛇
在字符串或內部行的開頭匹配“Python”
2
蟒蛇$
在字符串或行的末尾匹配“Python”
3
\APython
匹配字符串開頭的“Python”
4
蟒蛇\Z
匹配字符串末尾的“Python”
5
\bPython\b
在單詞邊界匹配“Python”
6
\刷\ B
\B 是非單詞邊界:匹配“rube”和“ruby”中的“rub”,但不是單獨匹配
7
蟒蛇(?=?。?/p>
如果后跟感嘆號,則匹配“Python”。
8
Python(??。。?/p>
如果后面沒有感嘆號,則匹配“Python”。
帶括號的特殊語法
編號 示例和說明
1
R(?#comment)
匹配“R”。其余的都是評論
2
R(?i)uby
匹配“uby”時不區分大小寫
3
R(?i:uby)
和上面一樣
4
擦(?:y|le))
僅分組而不創建 \1 反向引用