今天mayuyu要與大家來學習正規表達式,正規表達式是一個非常有用的工具,它的強大之處就在于處理文本比對。
說白了正規表達式就是以一種模式去比對給定文本中所有符合這一模式的字元串,比如[a-za-z]\w+的含義是第一
個字元必須是字母,它的後面至少跟有一個或者更多由字母或者數字組成的字元。
那麼mayuyu将來一一介紹在正規表達式中常見的特殊字元。
1. |表示一個或操作 例如re1|re2表示比對re1或者re2
2. .表示任意字元(換行符除外) 例如a.表示字母a後面跟任意一個字元
3. ^表示字元串的開始 例如^dear表示比對所有以dear為開始的字元串
4. $表示字元串的結尾 例如$dear表示比對所有以dear為結尾的字元串
5. *表示比對前面出現的正規表達式零次或者多次 例如[0-9]*
6. +表示比對前面出現的正規表達式一次或者多次 例如[0-9]+
7. ?表示比對前面出現的正規表達式零次或者一次 例如[0-9]?
8. {n}表示比對前面出現的正規表達式n次 例如[0-9]{3}
9. {m,n}表示比對重複出現m次到n次的正規表達式 例如[0-9]{1,3}
10. [...]表示比對字元組裡出現的任意一個字元 例如[aeiou]
11. [..x-y..]表示比對從字元x到y的任意一個字元 例如[0-9]
12. [^...]表示不比對此字元集中出現的任意一個字元 例如[^aeiou]
13. (...)表示封閉括号中的正規表達式,并儲存為子組
14. (*|+|?|{})?表示非貪婪比對 例如.*?[a-z]
15. \d表示比對任何數字,其實跟[0-9]一樣,\d是\d的反義
16. \w表示比對任何字母和數字字元,跟[a-za-z0-9]一樣,\w是\w的反義
17. \s表示比對任何空白字元,和[\n\t\r\v\f]一樣,\s是\s的反義
18. \b表示比對單詞邊界,\b是\b的反義
上面基本上就是在python中常用到的特殊字元。我們知道在python正規表達式程式設計中要用到re子產品,我們要借助
這個子產品中的一些方法來完成比對,那麼現在就來介紹在正則比對中常用到的一些方法。
(1)compile(pattern,flags=0)
對正規表達式模式進行編譯,flags是可選辨別符,并傳回一個regex對象。
(2)match(pattern,string,flags=0)
嘗試用正規表達式pattern比對字元串string,比對成功傳回一個對象,否則飯或none。
(3)search(pattern,string,flags=0)
在字元串string中搜尋正規表達式模式pattern的第一次出現,比對成功傳回一個對象,否則傳回none。
(4)findall(pattern,string)
搜尋正規表達式的所有出現,傳回一個清單
(5)finditer(pattern,string)
傳回正規表達式所有出現的疊代器
(6)split(pattern,string,max=0)
根據正規表達式把字元串分割為一個清單
(7)sub(pattern,repl,string)
把字元串string中所有正規表達式pattern比對的地方替換成字元串repl
(8)group()
傳回全部比對對象
(9)groups()
傳回一個包含全部比對的子組的元組
對于上面的一些函數,現在mayuyu來深入探讨。。。
compile函數
compile函數說白了就是用來提升速度的,我們知道在python中的所有代碼最終都會被編譯為位元組碼,然
後才被解釋器執行,這樣在性能上會有很大的提升,因為利用compile函數編譯後得到的一個對象是經過
預編譯處理的,這樣與普通的正則字元串每次都要編譯再執行來比較性能無疑是最好的。
match函數與search函數的差別
它們的差別就是match隻比對以給定的正規表達式開頭的字元串,而search是在一個字元串中找一個正則
模式,比如pattern=‘foo‘,string=‘seafood‘,那麼如果用match是從string的開頭進行比對,所
以比對失敗,而如果用search則是從string的每一處進行比對,是以比對成功。
re的split和string的split函數
我們知道re子產品中和字元串中都有一個函數split(),它們的作用類似,不過不一樣,前者是根據正則表
達式模式分割字元串,而後者是根據固定的字元串分割,很顯然前者的功能更強大。
sub()函數和subn()函數
一般情況下sub()函數有3個參數,分别是pattern,repl和string,表示把string字元串中所有與正
則表達式pattern比對的字元串替換為repl。而subn()函數跟sub()幾乎一樣,隻是多傳回一個表示字
符串替換的次數的數字。
嗯,介紹完上面的各種函數後,貌似mayuyu還漏掉了兩個重要内容。。。(原始字元串和貪婪比對)
好吧,先來介紹原始字元串。。。
為什麼需要原始字元串?其實原始字元串的産生是由于正規表達式的存在,因為ascii字元和正規表達式的一些字元
會産生沖突,比如‘\b‘,在ascii字元中表示倒退鍵,但是‘\b‘同時也是一個正規表達式的特殊字元,代表比對一
個單詞邊界。
如果出現上述情況,實際上我們在正規表達式中我們完全可以通過一個反斜杠對它進行轉義,也就是這樣寫‘\\b‘,
但是這樣做會把問題複雜化,當有多個這樣的特殊字元出現時,可能會把你搞得天昏地暗,血肉模糊。是以這裡我們
就引入了原始字元串。如下比較:
是以在python的正規表達式中,我們把模式串設定為原始字元串是一個很好的習慣,這樣不會引起不必要的錯誤。
接下來mayuyu帶大家繼續讨論另一個重要的問題,貪婪比對。
好吧,mayuyu先說什麼是貪婪比對吧,在正規表達式中預設是貪婪比對的,也就是說,如果正規表達式中使用到通
配字,那麼它在按照從左到右的順序求值時,會盡量抓取滿足比對的最長字元串,先舉個例子吧。比如下面的字元串
‘mayuyu is from hongkong,her birthday is 1994-03-26‘
我們想要提取出mayuyu的生日,那麼我們貌似可以用如下語句:
哎呀,得到的不是mayuyu的生日,很明顯不符合要求哦,那麼實際上也說了,因為貪婪比對的原因,前面的通配符
一直比對到9,因為9後面的4是必須要有的,那麼最終就得到了這樣的錯誤結果,是以我們必須解除這樣的貪婪比對
方式,怎麼解除? 不用擔心啦,操作符‘?‘就是用來解除貪婪比對的,這個操作符用在‘*‘,‘+‘,‘?‘的後面,作用
是要求正規表達式引擎比對的字元越少越好,嗯,這樣我們對上述代碼稍加修改就能得到mayuyu想要的結果了。
嗯 ,至此,mayuyu基本将python的正規表達式講述完畢!!!