python re模塊重要函數(shù)變量:
1. compile() 根據(jù)正則表達(dá)式字符串闷袒,創(chuàng)建模式的對象努溃。
2. search() 在字符串中尋找模式温自。
3. match() 在字符串開始處匹配模式吃既。
4. split() 根據(jù)模式的匹配項來分割字符串斧蜕。
5. findall() 顯示出字符串中模式的所有匹配項渺杉。
6. sub(old,new) 方法的功能是蛇数,用將所有old的匹配項用new替換掉。
7. escape() 將字符串中所有特殊正則表達(dá)式字符轉(zhuǎn)義是越。
-
re.compile
:可以把正則表達(dá)式編譯成一個正則表達(dá)式對象耳舅。可以把那些經(jīng)常使用的正則表達(dá)式編譯成正則表達(dá)式對象倚评,這樣可以提高一定的效率浦徊。
import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
regex = re.compile(r'\w*oo\w*')
print regex.findall(text) #查找所有包含'oo'的單詞
print regex.sub(lambda m: '[' + m.group(0) + ']', text) #將字符串中含有'oo'的單詞用[]括起來。```
2. `re.split()`:會根據(jù)模式的匹配項來分割字符串天梧,類似于我們字符串的split方法盔性,不過它是用完整的正則表達(dá)式來替代了固定的分隔符。
`re.split(r'\s+', text)`將字符串按空格分割成一個單詞列表呢岗。
3. ` re.findall`:可以獲取字符串中所有匹配的字符串冕香。
`re.findall(r'\w*oo\w*', text)`獲取字符串中蛹尝,包含'oo'的所有單詞。
4. `re.sub()`用于替換字符串中的匹配項悉尾。
下面一個例子將字符串中的空格 ' ' 替換成 '-' :
```python
import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
print re.sub(r'\s+', '-', text) ```
re.sub的函數(shù)原型為:re.sub(pattern, repl, string, count)
其中第二個函數(shù)是替換后的字符串突那;本例中為'-'
第四個參數(shù)指替換個數(shù)。默認(rèn)為0构眯,表示每個匹配項都替換愕难。
re.sub還允許使用函數(shù)對匹配項的替換進行復(fù)雜的處理。
如:`re.sub(r'\s', lambda m: '[' + m.group(0) + ']', text, 0)`將字符串中的空格' '替換為'[ ]'鸵赖。
5. `re.match()`:嘗試從字符串的開始匹配一個模式务漩,如:下面的例子匹配第一個單詞
```python
import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
m = re.match(r"(\w+)\s", text)
if m:
print m.group(0), '\n', m.group(1)
else:
print 'not match'```
re.match的函數(shù)原型為:re.match(pattern, string, flags)
第一個參數(shù)是正則表達(dá)式,這里為"(\w+)\s"它褪,如果匹配成功饵骨,則返回一個Match,否則返回一個None茫打;
第二個參數(shù)表示要匹配的字符串居触;
第三個參數(shù)是標(biāo)致位,用于控制正則表達(dá)式的匹配方式老赤,如:是否區(qū)分大小寫轮洋,多行匹配等等。
5. `re.search()`:會在字符串內(nèi)查找模式匹配,只到找到第一個匹配然后返回抬旺,若字符串無匹配弊予,則返回None。
`re.search()`的函數(shù)原型為:`re.search(pattern, string, flags)`.每個參數(shù)的含意與re.match一樣开财。
import re
text = "JGood is a handsome boy, he is cool, clever, and so on..."
m = re.search(r'\shan(ds)ome\s', text)
if m:
print m.group(0), m.group(1)
else:
print 'not search' ```
re.match與re.search的區(qū)別:re.match只匹配字符串的開始汉柒,如果字符串開始不符合正則表達(dá)式,則匹配失敗责鳍,函數(shù)返回None碾褂;而re.search匹配整個字符串,直到找到一個匹配历葛。
1. (\b)代表著單詞的開頭或結(jié)尾正塌,也就是單詞的分界處
2. (.)匹配除了換行符以外的任意字符
3. (*)代表的不是字符,不是位置恤溶,而是數(shù)量乓诽。它指定*前邊的內(nèi)容可連續(xù)重復(fù)使用任意次以使整個表達(dá)式得到匹配
4. 為了避免重復(fù),可以這樣寫:0\d{2}-\d{8}咒程。這里\d后面的{2}({8})的意思是前面\d必須連續(xù)重復(fù)匹配2次(8次)
5. (\s)匹配任意的空白符问裕,包括空格,制表符(Tab)孵坚,換行符粮宛,中文全角空格等
6. (\w)匹配字母或數(shù)字或下劃線或漢字等
表1.常用的元字符
代碼 說明
. 匹配除換行符以外的任意字符
\w 匹配字母或數(shù)字或下劃線或漢字
\s 匹配任意的空白符
\d 匹配數(shù)字
\b 匹配單詞的開始或結(jié)束
^ 匹配字符串的開始
$ 匹配字符串的結(jié)束
| 或指明一個非貪婪限定符
\ 將下一個字符標(biāo)記為或特殊字符窥淆、或原義字符、或向后引用巍杈、或八進制轉(zhuǎn)義符
() 標(biāo)記一個子表達(dá)式的開始和結(jié)束位置忧饭。子表達(dá)式可以獲取供以后使用。
[ 標(biāo)記一個中括號表達(dá)式的開始
{ 標(biāo)記限定符表達(dá)式的開始
表2.常用的限定符
代碼/語法 說明
* 重復(fù)零次或更多次
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次,或指明一個非貪婪限定符
{n} 重復(fù)n次
{n,} 重復(fù)n次或更多次
{m,n} 重復(fù)m到n次
字符轉(zhuǎn)義:使用\來取消這些字符的特殊意義筷畦。
字符類:要想查找數(shù)字词裤,字母或數(shù)字,空白是很簡單的鳖宾,因為已經(jīng)有了對應(yīng)這些字符集合的元字符吼砂,但是如果你想匹配沒有預(yù)定義元字符的字符集合(比如元音字母a,e,i,o,u),應(yīng)該怎么辦?
很簡單鼎文,你只需要在方括號里列出它們就行了渔肩,像[aeiou]就匹配任何一個英文元音字母,[.?!]匹配標(biāo)點符號(.或?或!)拇惋。
我們也可以輕松地指定一個字符范圍周偎,像[0-9]代表的含意與\d就是完全一致的:一位數(shù)字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考慮英文的話)撑帖。
分枝條件:用|把不同的規(guī)則分隔開蓉坎。
分組:如果想要重復(fù)多個字符又該怎么辦?你可以用小括號來指定子表達(dá)式(也叫做分組)胡嘿。
表3.常用的反義代碼
代碼/語法 說明
\W 匹配任意不是字母蛉艾,數(shù)字,下劃線衷敌,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數(shù)字的字符
\B 匹配不是單詞開頭或結(jié)束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字符
后向引用:用于重復(fù)搜索前面某個分組匹配的文本勿侯。
例如,\1代表分組1匹配的文本逢享。
\b(\w+)\b\s+\1\b可以用來匹配重復(fù)的單詞,像go go, 或者kitty kitty吴藻。
你也可以自己指定子表達(dá)式的組名瞒爬。
要指定一個子表達(dá)式的組名,請使用這樣的語法:(?<Word>\w+)(或者把尖括號換成'也行:(?'Word'\w+)),這樣就把\w+的組名指定為Word了沟堡。
要反向引用這個分組捕獲的內(nèi)容侧但,你可以使用\k<Word>,所以上一個例子也可以寫成這樣:\b(?<Word>\w+)\b\s+\k<Word>\b。
表4.常用分組語法
分類 代碼/語法 說明
捕獲 (exp) 匹配exp,并捕獲文本到自動命名的組里
(?<name>exp) 匹配exp,并捕獲文本到名稱為name的組里航罗,也可以寫成(?'name'exp)
(?:exp) 匹配exp,不捕獲匹配的文本禀横,也不給此分組分配組號
零寬斷言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注釋 (?#comment) 這種類型的分組不對正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀
零寬斷言:用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西粥血。
(?=exp)也叫零寬度正預(yù)測先行斷言柏锄,它斷言自身出現(xiàn)的位置的后面能匹配表達(dá)式exp酿箭。比如\b\w+(?=ing\b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分)趾娃,如查找I'm singing while you're dancing.時缭嫡,它會匹配sing和danc。
(?<=exp)也叫零寬度正回顧后發(fā)斷言抬闷,它斷言自身出現(xiàn)的位置的前面能匹配表達(dá)式exp妇蛀。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時笤成,它匹配ading评架。
負(fù)向零寬斷言:只是想要確保某個字符沒有出現(xiàn),但并不想去匹配它時炕泳。
零寬度負(fù)預(yù)測先行斷言(?!exp)纵诞,斷言此位置的后面不能匹配表達(dá)式exp。例如:\d{3}(?!\d)匹配三位數(shù)字喊崖,而且這三位數(shù)字的后面不能是數(shù)字挣磨;\b((?!abc)\w)+\b匹配不包含連續(xù)字符串a(chǎn)bc的單詞。
同理荤懂,我們可以用(?<!exp),零寬度負(fù)回顧后發(fā)斷言來斷言此位置的前面不能匹配表達(dá)式exp:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數(shù)字茁裙。
注釋:(?#comment)
貪婪與懶惰:
貪婪匹配:匹配盡可能多的字符。
懶惰匹配:匹配盡可能少的字符节仿。用法:前面給出的限定符都可以被轉(zhuǎn)化為懶惰匹配模式晤锥,只要在它后面加上一個問號?。
a.*?b
匹配最短的廊宪,以a開始矾瘾,以b結(jié)束的字符串。如果把它應(yīng)用于aabab的話箭启,它會匹配aab(第一到第三個字符)和ab(第四到第五個字符)壕翩。
為什么第一個匹配是aab(第一到第三個字符)而不是ab(第二到第三個字符)?簡單地說傅寡,因為正則表達(dá)式有另一條規(guī)則放妈,比懶惰/貪婪規(guī)則的優(yōu)先級更高:最先開始的匹配擁有最高的優(yōu)先權(quán)——The match that begins earliest wins。
表5.懶惰限定符
代碼/語法 說明
*? 重復(fù)任意次荐操,但盡可能少重復(fù)
+? 重復(fù)1次或更多次芜抒,但盡可能少重復(fù)
?? 重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? 重復(fù)n到m次托启,但盡可能少重復(fù)
{n,}? 重復(fù)n次以上宅倒,但盡可能少重復(fù)
表6.常用的處理選項
名稱 說明
IgnoreCase(忽略大小寫) 匹配時不區(qū)分大小寫。
Multiline(多行模式) 更改^和$的含義屯耸,使它們分別在任意一行的行首和行尾匹配拐迁,而不僅僅在整個字符串的開頭和結(jié)尾匹配蹭劈。(在此模式下,$的精確含意是:匹配\n之前的位置以及字符串結(jié)束前的位置.)
Singleline(單行模式) 更改.的含義,使它與每一個字符匹配(包括換行符\n)唠亚。
IgnorePatternWhitespace(忽略空白) 忽略表達(dá)式中的非轉(zhuǎn)義空白并啟用由#標(biāo)記的注釋链方。
ExplicitCapture(顯式捕獲) 僅捕獲已被顯式命名的組。
表7.尚未詳細(xì)討論的語法
代碼/語法 說明
\a 報警字符(打印它的效果是電腦嘀一聲)
\b 通常是單詞分界位置灶搜,但如果在字符類里使用代表退格
\t 制表符祟蚀,Tab
\r 回車
\v 豎向制表符
\f 換頁符
\n 換行符
\e Escape
\0nn ASCII代碼中八進制代碼為nn的字符
\xnn ASCII代碼中十六進制代碼為nn的字符
\unnnn Unicode代碼中十六進制代碼為nnnn的字符
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串開頭(類似^割卖,但不受處理多行選項的影響)
\Z 字符串結(jié)尾或行尾(不受處理多行選項的影響)
\z 字符串結(jié)尾(類似$前酿,但不受處理多行選項的影響)
\G 當(dāng)前搜索的開頭
\p{name} Unicode中命名為name的字符類,例如\p{IsGreek}
(?>exp) 貪婪子表達(dá)式
(?<x>-<y>exp) 平衡組
(?im-nsx:exp) 在子表達(dá)式exp中改變處理選項
(?im-nsx) 為表達(dá)式后面的部分改變處理選項
(?(exp)yes|no) 把exp當(dāng)作零寬正向先行斷言鹏溯,如果在這個位置能匹配罢维,使用yes作為此組的表達(dá)式;否則使用no
(?(exp)yes) 同上丙挽,只是使用空表達(dá)式作為no
(?(name)yes|no) 如果命名為name的組捕獲到了內(nèi)容肺孵,使用yes作為表達(dá)式;否則使用no
(?(name)yes) 同上颜阐,只是使用空表達(dá)式作為no