正則表達(dá)式筆記

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)義是越。

  1. 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末平窘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凳怨,更是在濱河造成了極大的恐慌瑰艘,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肤舞,死亡現(xiàn)場離奇詭異紫新,居然都是意外死亡,警方通過查閱死者的電腦和手機李剖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門芒率,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人篙顺,你說我怎么就攤上這事偶芍。” “怎么了慰安?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵腋寨,是天一觀的道長聪铺。 經(jīng)常有香客問我化焕,道長,這世上最難降的妖魔是什么铃剔? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任撒桨,我火速辦了婚禮查刻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凤类。我一直安慰自己穗泵,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布谜疤。 她就那樣靜靜地躺著佃延,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夷磕。 梳的紋絲不亂的頭發(fā)上履肃,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音坐桩,去河邊找鬼尺棋。 笑死,一個胖子當(dāng)著我的面吹牛绵跷,可吹牛的內(nèi)容都是我干的膘螟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼碾局,長吁一口氣:“原來是場噩夢啊……” “哼荆残!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起擦俐,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤脊阴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蚯瞧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘿期,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年埋合,在試婚紗的時候發(fā)現(xiàn)自己被綠了备徐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甚颂,死狀恐怖蜜猾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情振诬,我是刑警寧澤蹭睡,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站赶么,受9級特大地震影響肩豁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一清钥、第九天 我趴在偏房一處隱蔽的房頂上張望琼锋。 院中可真熱鬧,春花似錦祟昭、人聲如沸缕坎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谜叹。三九已至,卻和暖如春搬葬,著一層夾襖步出監(jiān)牢的瞬間叉谜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工踩萎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留停局,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓香府,卻偏偏與公主長得像董栽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子企孩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 正則表達(dá)式到底是什么東西锭碳?字符是計算機軟件處理文字時最基本的單位,可能是字母勿璃,數(shù)字擒抛,標(biāo)點符號,空格补疑,換行符歧沪,漢字等...
    獅子挽歌閱讀 2,145評論 0 9
  • 元字符量詞字符類分支條件反義分組后向引用零寬斷言負(fù)向零寬斷言注釋貪婪與懶惰處理選項平衡組/遞歸匹配其它 元字符 ...
    神刀閱讀 272評論 0 0
  • re模塊手冊 本模塊提供了和Perl里的正則表達(dá)式類似的功能,不關(guān)是正則表達(dá)式本身還是被搜索的字符串莲组,都可以...
    喜歡吃栗子閱讀 4,002評論 0 13
  • 注:本篇文章只為方便查看诊胞,特此保留,如有冒犯锹杈,敬請諒解D旃隆!竭望! 本文目標(biāo) 30分鐘內(nèi)讓你明白正則表達(dá)式是什么邪码,并對它...
    阿杰Alex閱讀 1,483評論 0 10
  • 正則表達(dá)式一般用于檢索,替換文本咬清。 一.正則表達(dá)式元字符和語法: 這些語法是每種語言都通用的闭专。接下來記一下pyth...
    omuraisu閱讀 648評論 0 2