位置:首頁 > 腳本語言 > Python教學 > Python正則表達式

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 匹配字符串的開始