正規表示式是一個特殊的字元序列,它能幫助你方便的檢查一個字串是否與某種模式相符。 Python 自1.5版本起增加了re 模組,它提供 Perl 風格的正規表示式模式。
re 模組讓 Python 語言擁有全部的正規表示式功能。
compile 函數根據一個模式字串和可選的標誌參數產生一個正規表示式物件。該物件擁有一系列方法用於正規表示式匹配和替換。
re 模組也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字串做為它們的第一個參數。
本章節主要介紹Python中常用的正規表示式處理函數。
re.match函數
re.match 嘗試從字串的開始匹配一個模式。
函數語法:
re.match(pattern, string, flags=0)
pattern 匹配的正規表達式 string 要符合的字串。 flags 標誌位,用於控制正規表示式的符合方式,如:是否區分大小寫,多行配對等等。 符合成功re.match方法傳回一個符合的對象,否則回傳None。 我們可以使用group(num) 或 groups() 匹配物件函數來取得匹配表達式。 匹配物件方法描述 group(num=0) 匹配的整個表達式的字串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。 groups() 傳回一個包含所有小組字串的元組,從 1 到 所包含的小組號碼。 實例: #!/usr/bin/pythonimport re line atchObj = re.match( r'(.* ) are (.*?) .*', line, re.M|re.I) if matchObj: "matchObj.j: matchObj .group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2)
以上實例執行結果如下:
matchObj.group() : Cats are smarter than dogs
matchObj85:1) smarter
re.search方法
re.match 嘗試從字串的開始匹配一個模式。
函數語法:
re.search(pattern, string, flags=0)
pattern 匹配的正規表達式
string 要符合的字串。
flags 標誌位,用於控制正規表示式的符合方式,如:是否區分大小寫,多行配對等等。
匹配成功re.search方法方法傳回一個符合的對象,否則回傳None。
我們可以使用group(num) 或 groups() 匹配物件函數來取得匹配表達式。
匹配物件方法
描述
group(num=0) 匹配的整個表達式的字串,group() 可以一次輸入多個組號,在這種情況下它將返回一個包含那些組所對應值的元組。
groups() 傳回一個包含所有小組字串的元組,從 1 到 所包含的小組號碼。
實例:
#!/usr/bin/python
import re
line matchObj = re.match( r'(. *) are (.*?) .*', line, re.M|re.I)
if matchObj:
"matchObj.j:
matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)🜖:o
以上實例執行結果如下:
matchObj.group() : Cats are smarter than dogs
matchOb.are smarter than dogsmatchOb。 : smarter
re.match與re.search的區別
re.match只符合字串的開始,如果字串開始不符合正規表示式,則匹配失敗,函數傳回None;而re.search匹配整個字串,直到找到一個匹配。
實例:
#!/usr/bin/python
import re
mŠ=hammo"Catscom atchObj = re.match( r'dogs' , line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() :
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
)
else:
print "No match!!"
bj.group() : dogs
檢索和替換
Python 的re模組提供了re.sub用於替換字串中的匹配。
語法:
re.sub(pattern, repl, string, max=0)
(如果模式沒有發現,字元將被沒有改變地回傳。
可選參數 count 是模式匹配後替換的最大次數;count 必須是非負整數。預設值是 0 表示替換所有的匹配。
實例:
#!/usr/bin/python
import re
phone = re
phone = re
phone = re5-9599950
# Delete Python-style comments num = re.sub(r'#.*$', "", phone)print "Phone Num : ", num 'D', "", phone) print "Phone Num : ", num 004-959-559Phone Num : 2004959559 正規表示式修飾符- 選用標誌正規表示式可以包含一些可選標誌修飾符來控制匹配的模式。修飾符被指定為一個可選的標誌。多個標誌可以透過位元 OR(|) 它們來指定。如re.I | re.M 被設定成I 和M 標誌: 修飾符描述 re.I 使符合對大小寫不敏感化-aware)匹配 re.M 多行匹配,影響^ 和$ re.S 使. 匹配包括換行在內的所有字符集字符根據字符根據字符解析。這個標誌影響 w, W, b, B.
re.X 該標誌透過給予你更靈活的格式以便你將正規表示式寫得更易於理解。
正規表示式模式
模式字串使用特殊的語法來表示一個正規表示式:
字母和數字表示他們自己。一個正規表示式模式中的字母和數字匹配相同的字串。
多數字母和數字前加一個反斜線時會擁有不同的意義。
標點符號只有被轉義時才匹配自身,否則它們表示特殊的意義。
反斜線本身需要使用反斜線轉義。
由於正規表示式通常都包含反斜杠,所以你最好使用原始字串來表示它們。模式元素(如 r'/t',等價於'//t')匹配對應的特殊字元。
下表列出了正規表示式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標誌參數,某些模式元素的意義會改變。
模式
描述
^ 匹配字串的開頭
$ 匹配字串的結尾。
. 匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。
[...] 用來表示一組字元,單獨列出:[amk] 匹配'a','m'或'k'
[^...] 不在[]中的字元:[^ abc] 符合除了a,b,c之外的字元。
re* 符合0個或多個的表達式。
re+ 符合1個或多個的表達式。
re? 配對0個或1個由前面的正規表示式定義的片段,貪婪方式
re{ n}
re{ n,} 精確匹配n個前面表達式。
re{ n, m} 匹配n 到m 次由前面的正規表示式定義的片段,貪婪方式
a| b 配對a或b
(re) 組
(?imx) 正規表示式包含三種可選標誌:i, m, 或x 。只影響括號中的區域。
(?-imx) 正規表示式關閉 i, m, 或 x 選用標誌。只影響括號中的區域。
(?: re) 類似(...), 但不表示一個組
(?imx: re) 在括號中使用i, m, 或x 可選標誌
(?-imx: re括號內不使用i, m, 或x 可選標誌
(?#...) 註釋.
(?= re) 前向肯定界定符。如果所含正規表示式,以 ... 表示,在目前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩餘部分還要嘗試界定符的右邊。
(?! re) 前向否定界定符。與肯定界定符相反;當所含表達式不能在字串當前位置匹配時成功
(?> re) 匹配的獨立模式,省去回溯。
w 匹配字母數字
W 匹配非字母數字
s 匹配任意空白字符,等效任意數字,等價於[0-9 ]。 c
z 配對字串結束
G 配對最後符合完成的位置。
b 配對一個單字邊界,也就是指單字和空格之間的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
B 配對非單字邊界。 'erB' 能符合 "verb" 中的 'er',但不能符合 "never" 中的 'er'。
n, t, 等. 配對一個換行符。匹配一個製表符。等
1...9 符合第n個分組的子運算式。
10 符合第n個分組的子表達式,如果它經過配對。否則指的是八進位碼的表達式。
正規表示式實例
字元符合
實例
描述
python 描述
[Pp]ython 配對" Python" 或"python"
rub[ye] 匹配"ruby" 或"rube"
[aeiou] 匹配中任何一個中的一個字母括號類似[0123456789]
[a-z] 配對任何小寫字母
[A-Z] 搭配任何大寫字母 aeiou] 除了aeiou字母以外的所有字元
[^0-9] 匹配除了數字外的字元
特殊字元類別
實例
" 所描述的單一字元之外。若要符合包括 'n' 在內的任何字符,請使用象 '[.n]' 的模式。 d 匹配一個數字字元。等價於 [0-9]。 D 符合一個非數字字元。等價於 [^0-9]。 s 符合任何空白字符,包括空格、製表符、換頁符等等。等價於 [ fnrtv]。 S 符合任何非空白字元。等價於 [^ fnrtv]。 w 匹配包括底線的任何單字字元。等價於'[A-Za-z0-9_]'。 W 符合任何非單字字元。等價於 '[^A-Za-z0-9_]'。