天天看點

python正規表達式re

1. 正規表達式簡介

正規表達式并不是python的一部分。在提供了正規表達式的語言裡,正規表達式的文法都是一樣的,差別

隻在于不同的程式設計語言實作支援的文法數量不同;但不被支援的文法通常是不常用的部分。python正則表

達式是用于文本比對的強大工具,在源字元串中查找與給定的正規表達式相比對的部分。一個正規表達式

是由字母、數字和特殊字元(括号、星号和問号等)組成。

正規表達式中的特殊字元:

^      正規表達式的開始字元

$      正規表達式的結束字元

\w     比對字母、數字、下劃線,等價于[a-za-z0-9_] 

\w     比對不是字母、數字、下劃線的字元

\s     比對空白字元

\s     比對不是空白的字元 

\d     比對數字,等價于[0-9] 

\d     比對非數字的字元

\b     比對單詞的開始和結束

\b     比對不是單詞開始和結束的位置

.      比對任意字元,包括漢字

[m]    比對單個字元串

[m…n] 比對多個字元串

[m-n]  比對m到n區間内的數字、字母

[^m]   比對除m以外的字元串

()     對正規表達式進行分組,一對圓括号表示一組

其中,比對符"[]"可以指定一個比對範圍,例如[ok]将比對包含o或k的字元

"("和")"等正規表達式中的特殊字元,如果要把它們當做普通字元處理,需要在前面加上轉義字元"\"

正規表達式中的限定符:

*     比對0次或多次

+     比對1次或多次

?     比對1次或0次

{m}   重複m次

{m,n} 重複m到n次。其中n可以省略,表示m到任意次

利用{}可以控制字元重複出現的次數。例如,\d{1,4}表示1位到3位數字。

限定符與"?"(貪婪性)的使用

*?     比對0次或多次,且最短比對

+?     比對1次或多次,且最短比對

??     比對1次或0次,且最短比對

{m,n}? 重複m到n此,且最短比對

{?#…} 正規表達式中的注釋

{?p<name>…} 給分組命名,name表示分組的名稱

{?p=name}    使用名為name的分組

2. 使用re子產品處理正規表達式

re子產品的一些函數都有一個flags參數,該參數用于設定比對的規則選項。規則選項分别如下:

?i(ignorecase): 忽略大小寫(完整寫法:re.i或re.ignorecase,下同)

?m(multiline): 多行模式,改變‘^‘和‘$‘的行為

?s(dotall): 點任意比對模式,改變‘.‘的行為

?l(locale): 使預定字元類 \w \w \b \b \s \s 取決于目前區域設定

?u(unicode): 使預定字元類 \w \w \b \b \s \s \d \d 取決于unicode定義的字元屬性

?x(verbose): 詳細模式。這個模式下正規表達式可以是多行,忽略空白、換行,以友善添加注釋。

re子產品提供了一些根據正規表達式進行查找、替換和分割字元串的函數,這些函數使用正規表達式作為第

一個參數。re子產品常用函數如下:

findall(pattern,string[,flags=0])

從string内查找符合pattern的表達式,然後傳回list清單

split(pattern,string[,maxsplit=0])

按照能夠比對的子串将string分割後傳回清單。maxsplit用于指定最大分割次數,不指定将全部分割。

sub(pattern,repl,string[,count=0])

repl可以是字元串,也可以是函數。

當repl是字元串的時候,就是把string内符合pattern的子串用repl替換;

當repl是函數的時候,對每一個在string内不重疊的,比對pattern的子串,調用repl(substring),然

後用傳回值替換substring

count用于指定最多替換次數,不指定時全部替換。

subn(pattern,repl,string[,count=0]): 

功能與sub()相同,但是多傳回一個值,即比對後的替換次數 

match(pattern,string[,flags=0])

根據pattern從string頭部開始比對字元串,隻傳回第一次比對成功的對象(matchobject對象)。否則傳回

none

search(pattern,string[,flags=0])

根據pattern在string中比對字元串,隻傳回第一次比對成功的對象(matchobject對象)。否則傳回none

match對象是一次比對的結果,match對象的屬性和方法:

屬性:

string: 搜尋的字元串。 

re: 比對時使用的pattern對象。 

pos: 搜尋的開始索引位置。值與pattern.match()和pattern.seach()方法的同名參數相同。 

endpos: 搜尋的結束索引位置。值與pattern.match()和pattern.seach()方法的同名參數相同。 

lastindex: 最後一個被捕獲的分組在文本中的索引。如果沒有被捕獲的分組,将為none。 

lastgroup: 最後一個被捕獲的分組的别名。如果這個分組沒有别名或者沒有被捕獲的分組,将為none。 

方法:

group([group1, …]): 

獲得一個或多個分組截獲的字元串;指定多個參數時将以元組形式傳回。group1可以使用編号也可以使用

别名;編号0代表整個比對的子串;不填寫參數時,傳回group(0);沒有截獲字元串的組傳回none;截獲了

多次的組傳回最後一次截獲的子串。 

groups([default]):

以元組形式傳回全部分組截獲的字元串。相當于調用group(1,2,…last)。default表示沒有截獲字元串的

組以這個值替代,預設為none。 

groupdict([default]): 

傳回以有别名的組的别名為鍵、以該組截獲的子串為值的字典,沒有别名的組不包含在内。default含義同

上。 

start([group]):

傳回指定的組截獲的子串在string中的起始索引(子串第一個字元的索引)。group預設值為0。 

end([group]): 

傳回指定的組截獲的子串在string中的結束索引(子串最後一個字元的索引+1)。group預設值為0。 

span([group]): 

傳回(start(group), end(group))。 

expand(template):

将比對到的分組代入template中然後傳回。template中可以使用\id或\g<id>、\g<name>引用分組,但不能

使用編号0。\id與\g<id>是等價的;但\10将被認為是第10個分組,如果你想表達\1之後是字元‘0‘,隻能

使用\g<1>0。

正規表達式的解析非常費時。如果多次使用findall()比對字元串,搜尋效率可能比較低。如果要多次使用

同一規則比對字元串,可以使用compile()函數進行預編譯,compile()函數傳回一個pattern對象。該對象

擁有一系列方法用于查找、替換和擴充字元串,進而提高字元串的比對速度。

compile(pattern[,flag=0]): 

将字元串形式的正規表達式編譯為pattern對象。第二個參數flag是比對模式,取值可以使用按位或運算符

‘|‘表示同時生效,比如re.i|re.m

pattern對象的屬性和方法:

pattern: 編譯時用的表達式字元串。

flags: 編譯時用的比對模式。數字形式。

groups: 表達式中分組的數量。

groupindex: 以表達式中有别名的組的别名為鍵、以該組對應的編号為值的字典,沒有别名的組不包含在

内。

findall(string[,start[,end]]):查找所有符合pattern對象的結果,傳回一個包含比對結果的清單

finditer(string[,start[,end]]):傳回一個包含比對結果(match對象)的位址

match(string[,start[,end]]):用法同match()

search(string[,start[,end]]):用法同search()