天天看點

Python基礎(9)--正規表達式

正規表達式是一個很有用的工具,可處理複雜的字元比對和替換工作。在python中内置了一個re子產品以支援正規表達式。

正規表達式有兩種基本的操作,分别是比對和替換。

比對就是在一個文本字元串中搜尋比對一特殊表達式;

替換就是在一個字元串中查找并替換比對一特殊表達式的字元串。

正規表達式定義了一系列的特殊字元元素以執行比對動作。

正規表達式基本字元

字元

描述

text

比對text字元串

.

比對除換行符之外的任意一個單個字元

^

比對一個字元串的開頭

$

比對一個字元串的末尾

在正規表達式中,我們還可用比對限定符來限制比對的次數。

比對限定符

最大比對

最小比對

*

重複比對前表達式零次或多次

+

重複比對前表達式一次或多次

重複比對前表達式零次或一次

{m}

精确重複比對前表達式m次

{m,}

至少重複比對前表達式m次

{m,n}

至少重複比對前表達式m次,至多重複比對前表達式n次

據上所述,".*"為最大比對,能比對源字元串所有能比對的字元串。".*

"為最小比對,隻比對第一次出現的字元串。如:d.*g能比對任意以d開頭,以g結尾的字元串,如"debug"和"debugging",甚至"dog

is walking"。而d.* g隻能比對"debug",在"dog is walking"字元串中,則隻比對到"dog "。

在一些更複雜的比對中,我們可用到組和運算符。

組和運算符

[...]

比對集合内的字元,如[a-z],[1-9]或[,./;']

[^...]

比對除集合外的所有字元,相當于取反操作

a|b

比對表達式a或b,相當于or操作

(...)

表達式分組,每對括号為一組,如([a-b]+)([a-z]+)([1-9]+)

\number

比對在number表達式組内的文本

有一組特殊的字元序列,用來比對具體的字元類型或字元環境。如\b比對字元邊界,food\b比對"food"、"zoofood",而和"foodies"不比對。

特殊字元序列

\a

隻比對字元串的開始

\b

比對一個單詞邊界

比對一個單詞的非邊界

\d

比對任意十進制數字字元,等價于r'[0-9]'

比對任意非十進制數字字元,等價于r'[^0-9]'

\s

比對任意空格字元(空格符、tab制表符、換行符、回車、換頁符、垂直線符号)

比對任意非空格字元

\w

比對任意字母數字字元

比對任意非字母數字字元

\z

僅比對字元串的尾部

\\

比對反斜線字元

有一套聲明(assertion)對具體事件進行聲明。

正規表達式聲明

聲明

( ilmsux)

比對空字元串,ilmsux字元對應下表的正規表達式修飾符。

( :...)

比對圓括号内定義的表達式,但不填充字元組表。

( p<name>)

比對圓括号内定義的表達式,但比對的表達式還可用作name辨別的符号組。

( p=name)

比對所有與前面命名的字元組相比對的文本。

( #...)

引入注釋,忽略圓括号内的内容。

( =...)

如果所提供的文本與下一個正規表達式元素比對,這之間沒有多餘的文本就比對。這允許在一個表達式中進行超前操作,而不影響正規表達式其餘部分的分析。如"martin"其後緊跟"brown",則"martin( =brown)"就隻與"martin"比對。

( !...)

僅當指定表達式與下一個正規表達式元素不比對時比對,是( =...)的反操作。

( <=...)

如果字元串目前位置的字首字元串是給定文本,就比對,整個表達式就在目前位置終止。如( <=abc)def表達式與"abcdef"比對。這種比對是對字首字元數量的精确比對。

( <!...)

如果字元串目前位置的字首字元串不是給定的正文,就比對,是( <=...)的反操作。

正規表達式還支援一些處理标志,它會影響正則式的執行方法。

處理标志

标志

i或ignorecase

忽略表達式的大小寫來比對文本。

通過re子產品,我們就可在python中利用正則式對字元串進行搜尋、抽取和替換操作。如:re.search()函數能執行一個基本的搜尋操作,它能傳回一個matchobject對象。re.findall()函數能傳回比對清單。

matchobject對象方法

方法

expand(template)

展開模闆中用反斜線定義的内容。

m.group([group,...])

傳回比對的文本,是個元組。此文本是與給定group或由其索引數字定義的組比對的文本,如果沒有組定組名,則傳回所有比對項。

m.groups([default])

傳回一個元組,該元組包含模式中與所有組比對的文本。如果給出default參數,default參數值就是與給定表達式不比對的組的傳回值。default參數的預設取值為none。

m.groupdict([default])

傳回一個字典,該字典包含比對的所有子組。如果給出default參數,其值就是那些不比對組的傳回值。default參數的預設取值為none。

m.start([group])

傳回指定group的開始位置,或傳回全部比對的開始位置。

m.end([group])

傳回指定group的結束位置,或傳回全部比對的結束位置。

m.span([group])

傳回兩元素組,此元組等價于關于一給定組或一個完整比對表達式的(m.start(group),m.end(group)))清單

m.pos

傳遞給match()或search()函數的pos值。

m.endpos

傳遞給match()或search()函數的endpos值。

m.lastindex

m.lastgroup

m.re

建立這個matchobject對象的正則式對象

m.string

提供給match()或search()函數的字元串。

使用sub()或subn()函數可在字元串上執行替換操作。sub()函數的基本格式如下:

示例

replace參數可接受函數。要獲得替換的次數,可使用subn()函數。subn()函數傳回一個元組,此元組包含替換了的文本和替換的次數。

如果需用同一個正則式進行多次比對操作,我們可把正則式編譯成内部語言,提高處理速度。編譯正則式用compile()函數來實作。compile()函數的基本格式如下:

str表示需編譯的正則式串,flags是修飾标志符。正則式被編譯後生成一個對象,該對象有多種方法和屬性。

正則式對象方法/屬性

方法/屬性

r.search(string[,pos[,endpos]])

同search()函數,但此函數允許指定搜尋的起點和終點

r.match(string[,pos[,endpos]])

同match()函數,但此函數允許指定搜尋的起點和終點

r.split(string[,max])

同split()函數

r.findall(string)

同findall()函數

r.sub(replace,string[,count])

同sub()函數

r.subn(replace,string[,count])

同subn()函數

r.flags

建立對象時定義的标志

r.groupindex

将r'( pid)'定義的符号組名字映射為組序号的字典

r.pattern

在建立對象時使用的模式

轉義字元串用re.escape()函數。

通過getattr擷取對象引用