Python正則表達式
正則表達式是字符一個特殊的序列,可幫助匹配或者尋找其他的字符串或一組字符串,用一個模式支持一個專門的語法。正則表達式被廣泛應用於UNIX世界中。
模塊re在Python提供類似Perl的正則表達式全麵支持。 re模塊引發異常re.error如果在編譯或使用正則表達式時發生錯誤。
我們將涉及兩個重要的功能,這將被用於處理的正則表達式。但是首先:有各種各樣的字符,當它們在正則表達式中使用,將有特殊的意義。為了避免在處理正則表達式的任何困惑,將使用原始字符串作為r'expression“。
match函數
此函數會嘗試重新模式匹配字符串可選標誌。
下麵是此函數的語法:
re.match(pattern, string, flags=0)
這裡的參數的說明:
參數 | 描述 |
---|---|
pattern | 這是正則表達式來進行匹配。 |
string | 這是字符串,這將被搜索匹配的模式,在字符串的開頭。 |
flags | 可以指定使用位的不同的標誌OR (|)。這些改性劑,其列於下表中。 |
re.match函數返回成功,失敗匹配對象則返回None。我們會group(num) orgroups()函數匹配對象來獲得匹配的表達式。
匹配對象的方法 | 描述 |
---|---|
group(num=0) | 此方法返回整個匹配(或指定分組num) |
groups() | 此方法返回所有元組匹配的子組(空,如果冇有) |
例子:
#!/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
search函數
此函數將搜索字符串中使用可選的標誌第一次出現的RE模式。
下麵是此函數語法:
re.search(pattern, string, flags=0)
這裡的參數說明:
參數 | 描述 |
---|---|
pattern | 這是正則表達式來進行匹配。 |
string | 這是字符串,這將被搜索到的字符串中的任何位置匹配的模式。 |
flags | 可以指定使用位的不同的標誌OR (|)。這些改性劑,其列於下表中。 |
re.search函數返回成功,冇有失敗的匹配對象。我們會用group(num) 或groups() 函數來獲得匹配的表達式。
匹配對象的方法 | 描述 |
---|---|
group(num=0) | 此方法返回整個匹配(或指定分組num) |
groups() | 此方法返回所有元組匹配的子組(空,如果冇有) |
例子:
#!/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!!"
當執行上麵的代碼,它產生以下結果:
matchObj.group() : Cats are smarter than dogs matchObj.group(1) : Cats matchObj.group(2) : smarter
匹配VS搜索:
python提供基於正則表達式兩種不同的基本操作:隻在字符串的開頭匹配檢查的匹配,而對於一個匹配字符串中的任何位置搜索檢查(這是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 --> matchObj.group() : dogs
搜索和替換:
一些最重要的re方法,使用正則表達式sub。
語法
re.sub(pattern, repl, string, max=0)
這種方法取代了RE模式字符串中使用的Perl所有匹配,替換所有出現如果提供最大匹配。這個方法將返回修改後的字符串。
例子
下麵是一個例子:
#!/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
正則表達式修飾符 - 選項標誌
正則表達式字麵可以包含一個可選的修飾符來控製匹配的各個方麵。修飾符被指定為一個可選的標誌。可以使用異或提供多個修飾符(|),如先前所示,並且可以由這些中的一個來表示:
修辭符 | 描述 |
---|---|
re.I | 執行不區分大小寫的匹配。 |
re.L | 根據當前的語言環境解釋詞組。這種解釋影響字母組(w和W),以及單詞邊界的行為(和B) |
re.M | 使$匹配一行(串的不隻是端部)的尾部,使^匹配的行(串不隻是開始)的開始 |
re.S | 使一個句號(點)匹配任何字符,包括換行符 |
re.U | 根據Unicode字符集解釋的字母。這個標誌會影響w, W, , B的行為。 |
re.X | 許可證“cuter”正則表達式語法。它忽略空格(除了一組[]或當用一個反斜杠轉義內),並把轉義#作為注釋標記 |
正則表達式模式:
除了控製字符(+ ? . * ^ $ ( ) [ ] { } | ),所有字符匹配自己。可以通過用反斜杠前就轉義控製字符。
下表列出了Python中可用正則表達式語法:
模式 | 描述 |
---|---|
^ | 匹配的開始的 |
$ | 匹配行尾 |
. | 匹配除換行符的任何單個字符。使用-m選項允許其匹配換行符也是如此。 |
[...] | 匹配括號內任何單個字符 |
[^...] | 匹配任何單個字符不在括號中 |
re* | 匹配0個或多個匹配前麵表達式。 |
re+ | 匹配1個或多個先前出現的表達式。 |
re? | 匹配0或1前麵出現的表達式。 |
re{ n} | 精確匹配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 | 匹配的空白,等價於[ tñ r F] |
S | 匹配非空白 |
d | 匹配的數字。等價於[0-9] |
D | 匹配非數字 |
A | 匹配字符串的開始 |