正則表達(dá)式是一個(gè)特殊的字符序列,可以幫助您使用模式中保留的專門語法來匹配或查找其他字符串或字符串集。 正則表達(dá)式在UNIX世界中被廣泛使用。
注:很多開發(fā)人員覺得正則表達(dá)式比較難以理解,主要原因是缺少使用或不愿意在這上面花時(shí)間。
re模塊在Python中提供對(duì)Perl類正則表達(dá)式的完全支持。如果在編譯或使用正則表達(dá)式時(shí)發(fā)生錯(cuò)誤,則re模塊會(huì)引發(fā)異常re.error。
在這篇文章中,將介紹兩個(gè)重要的功能,用來處理正則表達(dá)式。 然而,首先是一件小事:有各種各樣的字符,這些字符在正則表達(dá)式中使用時(shí)會(huì)有特殊的意義。 為了在處理正則表達(dá)式時(shí)避免混淆,我們將使用:r'expression'原始字符串。
匹配單個(gè)字符的基本模式
| 編號(hào) | 表達(dá)式 | 描述 |
|---|---|---|
| 1 | a, X, 9, < |
普通字符完全匹配。 |
| 2 | . |
匹配任何單個(gè)字符,除了換行符’\n‘ |
| 3 | \w |
匹配“單詞”字符:字母或數(shù)字或下劃線[a-zA-Z0-9_]。 |
| 4 | \W |
匹配任何非字詞。 |
| 5 | \b |
字詞與非字詞之間的界限 |
| 6 | \s |
匹配單個(gè)空格字符 - 空格,換行符,返回,制表符 |
| 7 | \S |
匹配任何非空格字符。 |
| 8 | \t, \n, \r |
制表符,換行符,退格符 |
| 9 | \d |
十進(jìn)制數(shù)[0-9] |
| 10 | ^ |
匹配字符串的開頭 |
| 11 | $ |
匹配字符串的末尾 |
| 12 | \ |
抑制字符的“特殊性”,也叫轉(zhuǎn)義字符。 |
編譯標(biāo)志
編譯標(biāo)志可以修改正則表達(dá)式的某些方面。標(biāo)志在re模塊中有兩個(gè)名稱:一個(gè)很長的名稱,如IGNORECASE,和一個(gè)簡短的單字母形式,如I。
| 編號(hào) | 標(biāo)志 | 含義 |
|---|---|---|
| 1 | ASCII, A | 像\w,\b,\s和\d之間的幾個(gè)轉(zhuǎn)義只匹配ASCII字符與相應(yīng)的屬性。 |
| 2 | DOTALL, S | 匹配任何字符,包括換行符 |
| 3 | IGNORECASE, I | 不區(qū)分大小寫匹配 |
| 4 | LOCALE, L | 做一個(gè)區(qū)域感知的匹配 |
| 5 | MULTILINE, M | 多行匹配,影響^和$ |
| 6 | VERBOSE, X (for ‘extended’) | 啟用詳細(xì)的RE,可以更干凈,更容易理解 |
此函數(shù)嘗試將RE模式與可選標(biāo)志的字符串進(jìn)行匹配。
下面是函數(shù)的語法 -
re.match(pattern, string, flags = 0)
這里是參數(shù)的描述 -
pattern - 這是要匹配的正則表達(dá)式。 string - 這是字符串,它將被搜索用于匹配字符串開頭的模式。 |flags - 可以使用按位OR(|)指定不同的標(biāo)志。 這些是修飾符,如下表所列。re.match函數(shù)在成功時(shí)返回匹配對(duì)象,失敗時(shí)返回None。使用match(num)或groups()函數(shù)匹配對(duì)象來獲取匹配的表達(dá)式。
| 編號(hào) | 匹配對(duì)象 | 描述 |
|---|---|---|
| 1 | group(num = 0) |
此方法返回整個(gè)匹配(或特定子組num) |
| 2 | groups() |
此方法返回一個(gè)元組中的所有匹配子組(如果沒有,則返回為None) |
示例
#!/usr/bin/python3
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!!")
當(dāng)執(zhí)行上述代碼時(shí),會(huì)產(chǎn)生以下結(jié)果 -
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
此函數(shù)嘗試將RE模式與可選標(biāo)志的字符串進(jìn)行匹配。
下面是這個(gè)函數(shù)的語法 -
re.match(pattern, string, flags = 0)
這里是參數(shù)的描述 -
pattern - 這是要匹配的正則表達(dá)式。 string - 這是字符串,它將被搜索用于匹配字符串開頭的模式。 |flags - 可以使用按位OR(|)指定不同的標(biāo)志。 這些是修飾符,如下表所列。re.search函數(shù)在成功時(shí)返回匹配對(duì)象,否則返回None。使用match對(duì)象的group(num)或groups()函數(shù)來獲取匹配的表達(dá)式。
| 編號(hào) | 匹配對(duì)象 | 描述 |
|---|---|---|
| 1 | group(num = 0) |
此方法返回整個(gè)匹配(或特定子組num) |
| 2 | groups() |
此方法返回一個(gè)元組中的所有匹配子組(如果沒有,則返回為None) |
示例
#!/usr/bin/python3
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!!")
當(dāng)執(zhí)行上述代碼時(shí),會(huì)產(chǎn)生以下結(jié)果 -
matchObj.group() : Cats are smarter than dogs
matchObj.group(1) : Cats
matchObj.group(2) : smarter
Python提供基于正則表達(dá)式的兩種不同的原始操作:match檢查僅匹配字符串的開頭,而search檢查字符串中任何位置的匹配(這是Perl默認(rèn)情況下的匹配)。
示例
#!/usr/bin/python3
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!!")
當(dāng)執(zhí)行上述代碼時(shí),會(huì)產(chǎn)生以下結(jié)果 -
No match!!
search --> matchObj.group() : dogs
使用正則表達(dá)式re模塊中的最重要的之一是sub。
模塊
re.sub(pattern, repl, string, max=0)
此方法使用repl替換所有出現(xiàn)在RE模式的字符串,替換所有出現(xiàn),除非提供max。此方法返回修改的字符串。
示例
#!/usr/bin/python3
import re
phone = "2018-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)
當(dāng)執(zhí)行上述代碼時(shí),會(huì)產(chǎn)生以下結(jié)果 -
Phone Num : 2018-959-559
Phone Num : 2018959559
正則表達(dá)式文字可能包含一個(gè)可選修飾符,用于控制匹配的各個(gè)方面。 修飾符被指定為可選標(biāo)志??梢允褂卯惢?|)提供多個(gè)修飾符,如前所示,可以由以下之一表示 -
| 編號(hào) | 修辭符 | 描述 |
|---|---|---|
| 1 | re.I |
執(zhí)行不區(qū)分大小寫的匹配。 |
| 2 | re.L |
根據(jù)當(dāng)前語言環(huán)境解釋單詞。這種解釋影響字母組(\w和\W)以及字邊界行為(\b和\B)。 |
| 3 | re.M |
使$匹配一行的結(jié)尾(而不僅僅是字符串的結(jié)尾),并使^匹配任何行的開始(而不僅僅是字符串的開頭)。 |
| 4 | re.S |
使一個(gè)句點(diǎn)(.)匹配任何字符,包括換行符。 |
| 5 | re.U |
根據(jù)Unicode字符集解釋字母。 此標(biāo)志影響\w,\W,\b,\B的行為。 |
| 6 | re.X |
允許“cuter”正則表達(dá)式語法。 它忽略空格(除了一個(gè)集合[]內(nèi)部,或者用反斜杠轉(zhuǎn)義),并將未轉(zhuǎn)義的#作為注釋標(biāo)記。 |
除了控制字符(+ ? . * ^ $ ( ) [ ] { } | \),所有字符都與其自身匹配。 可以通過使用反斜杠將其轉(zhuǎn)換為控制字符。
字符常量
| 編號(hào) | 示例 | 說明 |
|---|---|---|
| 1 | python | 匹配“python”。 |
字符類
| 編號(hào) | 示例 | 說明 |
|---|---|---|
| 1 | [Pp]ython |
匹配“Python”或“python” |
| 2 | rub[ye] |
匹配“ruby”或“rube” |
| 3 | [aeiou] |
匹配任何一個(gè)小寫元音 |
| 4 | [0-9] |
匹配任何數(shù)字; 如[0123456789] |
| 5 | [a-z] |
匹配任何小寫ASCII字母 |
| 6 | [A-Z] |
匹配任何大寫的ASCII字母 |
| 7 | [a-zA-Z0-9] |
匹配上述任何一個(gè) |
| 8 | [^aeiou] |
匹配除小寫元音之外的任何東西 |
| 9 | [^0-9] |
匹配數(shù)字以外的任何東西 |
特殊字符類
| 編號(hào) | 示例 | 說明 |
|---|---|---|
| 1 | . |
匹配除換行符以外的任何字符 |
| 2 | \d |
匹配數(shù)字:[0-9] |
| 3 | \D |
匹配非數(shù)字:[^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_] |
重復(fù)匹配
| 編號(hào) | 示例 | 說明 |
|---|---|---|
| 1 | ruby? |
匹配“rub”或“ruby”:y是可選的 |
| 2 | ruby* |
匹配“rub”加上0個(gè)以上的y |
| 3 | ruby+ |
匹配“rub”加上1個(gè)或更多的y |
| 4 | \d{3} |
完全匹配3位數(shù) |
| 5 | \d{3,} |
匹配3位或更多位數(shù)字 |
| 6 | \d{3,5} |
匹配3,4或5位數(shù) |
非貪婪重復(fù)
這匹配最小的重復(fù)次數(shù) -
| 編號(hào) | 示例 | 說明 |
|---|---|---|
| 1 | <.*> |
貪婪重復(fù):匹配“<python> perl>” |
| 2 | <.*?> |
非貪婪重復(fù):在“<python> perl”中匹配“<python>” |
用圓括號(hào)分組
| 編號(hào) | 示例 | 說明 |
|---|---|---|
| 1 | \D\d+ |
沒有分組:+重復(fù)\d |
| 2 | (\D\d)+ |
分組:+重復(fù)\D\d對(duì) |
| 3 | ([Pp]ython(,)?)+ |
匹配“Python”,“Python,python,python”等 |
反向引用
這與以前匹配的組再次匹配 -
| 編號(hào) | 示例 | 說明 |
|---|---|---|
| 1 | ([Pp])ython&\1ails |
匹配python和pails或Python和Pails |
| 2 | (['"])[^\1]*\1 |
單引號(hào)或雙引號(hào)字符串。\1匹配第一個(gè)分組匹配。 \2匹配任何第二個(gè)分組匹配等 |
備擇方案
python|perl - 匹配“python”或“perl”rub(y|le) - 匹配 “ruby” 或 “ruble”Python(!+|\?) - “Python”后跟一個(gè)或多個(gè)! 還是一個(gè)?錨點(diǎn)
這需要指定匹配位置。
| 編號(hào) | 示例 | 說明 |
|---|---|---|
| 1 | ^Python |
在字符串或內(nèi)部行的開頭匹配“Python” |
| 2 | Python$ |
在字符串或內(nèi)部行的結(jié)尾匹配“Python” |
| 3 | \APython |
在字符串的開頭匹配“Python” |
| 4 | Python\Z |
在字符串的末尾匹配“Python” |
| 5 | \bPython\b |
在字詞的邊界匹配“Python” |
| 6 | \brub\B |
\B是非字詞邊界:在“rube”和“ruby”中匹配“rub”,而不是單獨(dú)匹配 |
| 7 | Python(?=!) |
匹配“Python”,如果跟著感嘆號(hào)。 |
| 8 | Python(?!!) |
匹配“Python”,如果沒有感嘆號(hào)后面。 |
帶括號(hào)的特殊語法
| 編號(hào) | 示例 | 說明 | |
|---|---|---|---|
| 1 | R(?#comment) |
匹配“R”。其余的都是注釋 | |
| 2 | R(?i)uby |
匹配“uby”時(shí)不區(qū)分大小寫 | |
| 3 | R(?i:uby) |
同上 | |
| 4 | `rub(?:y | le))` | 僅組合而不創(chuàng)建\1反向引用 |