|
這是菜鳥學python的第45篇原創(chuàng)文章 閱讀本文大概需要5分鐘 都說正則表達式有點像密碼,有的同學看到就頭疼,感覺迷一樣的。 那是因為你們沒有掌握一些基本的要領,今天我們會講9種常見的正則表達式的招式,(有同學會問這么多招,哪能記得住) 想要練成御劍飛行,基本功必須要扎實.這些都是最最基本的,哪怕死記硬背也要背住(其實2-3遍就能記住,真的不難) 插一句: 有一點要注意Python的字符串本身也用'\'轉義,所以要特別注意,一般我們都建議使用Python的r前綴,就不用考慮轉義的問題了 先說一個簡單的例子:匹配以cat開頭的 patt=re.compile(r'^cat') 表示匹配以c作為一行的第一個字符,后面跟著a,后面跟著t 所以'vocative'就不會被匹配到,原因是因為cat在字符的里面 如何我們要是以某一個字符串結尾的,比如我們要查郵件是以 BR或者Bestregards結尾的,如何匹配:我們用美元符號$來處理 import re sentence='''Hi Jack:\n Python is a beautiful language\n BR''' patt=re.compile(r'(BR|Bestregards)$') m=re.search(patt,sentence) if m : print 'match' else: print 'not match' >> match $表示匹配的位置是從行的結束的,也就是錨定在行的末尾,然后從行的末尾往前匹配BR或者是Bestregards,所以若你改成下面兩種都匹配不到 sentence='''Hi Jack:\n Python is a beautiful language\n BRs''' sentence='''Hi Jack:\n Python is a beautiful language\n Bestregard''' 解釋一下: 第一種情況,是把BR改成了BRs,所以匹配不到 第二種情況,是把Bestregards改成了Bestregard,所以也匹配不到 前面介紹了匹配行的開頭和結尾,那么如何匹配單詞的邊界呢,簡單正則里面有2個特殊字符\b and \B來匹配單詞的邊界 :
例如: the #匹配包含有'the'的字符串 \bthe #匹配任何以'the'開始的字符串 \bthe\b #僅僅匹配單詞'the' \Bthe #匹配任意包含'the'但不以'the'開頭的單詞 比如我們需要匹配'grey'或者'gray'的時候,怎么辦,可以用正則的[]來表示,gr[ea]y,表示先找到g,然后找到r,然后找到e或者a,最后是一個y import re 若把word改成'gray'也是匹配的 切記:字符組里面是匹配一個字符比如H[12345],表示H后面可以跟1或2或3或4或5,而不是12345,千萬不要弄錯了 我們可以用'|'來匹配任意子表達式,'|'是一個非常簡便的元字符,它的意思是'或',通過它我們能把不同的子表達式組合成一個總的表達式,比如'am'|'pm'就是能夠同時匹配其中任意一個的正則表達式,回頭再看上面的例子'gr[ea]y',其實能寫成'grey|gray',或者'gr(e|a)y' 比如6月4號,這個6月可能寫成'June'也可以寫成'Jun',而且日期也有可能寫作'fourth'或者'4th'或者4,我們可以寫成(June|Jun)(fourth|4th|4),但是有沒有其他辦法呢,可以用問號?表示可選項 我們分步來處理:
最后這個復雜的(June|Jun)(fourth|4th|4)就可以變成了June?(fourth|4(th)?),大家看懂了嗎~~有點暈是把,沒事吐吐就習慣了 重復出現用+和*表示,但是二者有一些小的區(qū)別
其實說白了*比+多一種不出現的情況,匹配盡可能多的次數,如果實在匹配不到也不要緊,+也是匹配多次,但連一次匹配都無法完成,就報告失敗 例如: a* #匹配a,aa,aaa,...還有'' a+ #匹配a,aa,aaa,... 解釋一下: a*表示0個或者多個a,所以為0的時候,就是空字符 a+表示1個或者多個a,所以a至少要有1次 1).比如我們想匹配前面的內容重復出現的次數,比如3次,或者是一個區(qū)間,比如1-3次,如何匹配: import re num_str='123aa45' patt=re.compile(r'([1-9]{3})') m=re.match(patt,num_str) if m: print m.group() >> 123 表示出現1-9之間的任意一個數字,并且這個數字只能重復出現3次 2).為重復匹配次數設定一個區(qū)間 比如美國股票的代碼,都是字符有大寫的也有小寫,基本都是在1到5個字母,如何用正則表達呢 簡單[a-zA-Z]{1,5},就可以來匹配美國股票代碼(1到5個字母) 比如我們想匹配除了1到6以外的任何字符串,怎么辦,簡單用[^1-6],這個字符組中開頭的^表示'排除的意思'.(有同學會舉手說,你剛才不是說^表示開頭嗎,怎么現在變成排除型了). 這位同學會搶答了,下面就是我要解釋的,正則的復雜性:
比如:找出字母g后面的字母不是u import re 細心的同學會發(fā)現,我們的目的是要'找出字母g后面的字母不是u',為啥'Guess'不在輸出結果里面,不是排除型嗎,我先不說答案,大家先思考一下,有興趣的同學可以留言,我會解答. 好了Python中的正則表達式元字符就講到這里啦,希望能給初學者一些啟發(fā),若有什么不懂的,也可以留言跟我探討交流. '歡迎大家關注 菜鳥學Python',更多好玩有趣的Python原創(chuàng)教程,趣味算法,經驗技巧,行業(yè)動態(tài),盡在菜鳥學Python,一起來學python吧 來源 | 菜鳥學python |
|
|
來自: Four兄 > 《Python筆記》