Regex有兩種基本的操作,分別是匹配和替換。
匹配就是在一個文本字串中搜尋匹配一特殊運算式;
替換就是在一個字串中尋找並替換匹配一特殊運算式的字串。
1.基本元素
Regex定義了一系列的特殊字元元素以執行匹配動作。
Regex基底字元
| 字元 |
描述 |
| text |
匹配text字串 |
| . |
匹配除分行符號之外的任意一個單個字元 |
| ^ |
匹配一個字串的開頭 |
| $ |
匹配一個字串的末尾 |
在Regex中,我們還可用匹配限定符來約束匹配的次數。
匹配限定符
| 最大匹配 |
最小匹配 |
描述 |
| * |
* |
重複匹配前運算式零次或多次 |
| + |
+ |
重複匹配前運算式一次或多次 |
|
|
重複匹配前運算式零次或一次 |
| {m} |
{m} |
精確重複匹配前運算式m次 |
| {m,} |
{m,} |
至少重複匹配前運算式m次 |
| {m,n} |
{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 |
匹配一個單詞邊界 |
| \B |
匹配一個單詞的非邊界 |
| \d |
匹配任意十進位數字字元,等價於r'[0-9]' |
| \D |
匹配任意非十進位數字字元,等價於r'[^0-9]' |
| \s |
匹配任意空白字元(空格符、tab定位字元、分行符號、斷行符號、換頁符、垂直線符號) |
| \S |
匹配任意非空白字元 |
| \w |
匹配任意字母數字字元 |
| \W |
匹配任意非字母數字字元 |
| \Z |
僅匹配字串的尾部 |
| \\ |
匹配反斜線字元 |
有一套聲明(assertion)對具體事件進行聲明。
Regex聲明
| 聲明 |
描述 |
| ( iLmsux) |
匹配Null 字元串,iLmsux字元對應下表的Regex修飾符。 |
| ( :...) |
匹配圓括弧內定義的運算式,但不填充字元組表。 |
| ( P) |
匹配圓括弧內定義的運算式,但匹配的運算式還可用作name標識的符號組。 |
| ( P=name) |
匹配所有與前面命名的字元組相匹配的文本。 |
| ( #...) |
引入注釋,忽略圓括弧內的內容。 |
| ( =...) |
如果所提供的文本與下一個Regex元素匹配,這之間沒有多餘的文本就匹配。這允許在一個運算式中進行超前操作,而不影響Regex其餘部分的分析。如"Martin"其後緊跟"Brown",則"Martin( =Brown)"就只與"Martin"匹配。 |
| ( !...) |
僅當指定運算式與下一個Regex元素不匹配時匹配,是( =...)的反操作。 |
| ( <=...) |
如果字串當前位置的前置詞字元串是給定文本,就匹配,整個運算式就在當前位置終止。如( <=abc)def運算式與"abcdef"匹配。這種匹配是對前置詞字元數量的精確匹配。 |
| ( |
如果字串當前位置的前置詞字元串不是給定的本文,就匹配,是( <=...)的反操作。 |
Regex還支援一些處理標誌,它會影響正則式的執行方法。
處理標誌
| 標誌 |
描述 |
| I或IGNORECASE |
忽略運算式的大小寫來匹配文本。 |
2.操作
通過re模組,我們就可在python中利用正則式對字串進行搜尋、抽取和替換操作。如:re.search()函數能執行一個基本的搜尋操作,它能返回一個MatchObject對象。re.findall()函數能返回匹配列表。
代碼如下:
>>> import re
>>> a="this is my re module test"
>>> obj = re.search(r'.*is',a)
>>> print obj
<_sre.SRE_Match object at 0xb7d7a218>
>>> obj.group()
'this is'
>>> re.findall(r'.*is',a)
['this is']
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()函數的基本格式如下:
sub(pattern,replace,string[,count])
樣本
代碼如下:
>>> str = 'The dog on my bed'
>>> rep = re.sub('dog','cat',str)
>>> print rep
The cat on my bed
replace參數可接受函數。要獲得替換的次數,可使用subn()函數。subn()函數返回一個元組,此元組包含替換了的文本和替換的次數。
如果需用同一個正則式進行多次匹配操作,我們可把正則式編譯成內部語言,提高處理速度。編譯正則式用compile()函數來實現。compile()函數的基本格式如下:
compile(str[,flags])
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擷取對象引用
代碼如下:
>>> li=['a','b']
>>> getattr(li,'append')
>>> getattr(li,'append')('c') #相當於li.append('c')
>>> li
['a', 'b', 'c']
>>> handler=getattr(li,'append',None)
>>> handler
>>> handler('cc') #相當於li.append('cc')
>>> li
['a','b','c','cc']
>>>result = handler('bb')
>>>li
['a','b','c','cc','bb']
>>>print result
None