場(chǎng)景
1.在一個(gè)文件中篓吁,查找出hello開(kāi)頭的語(yǔ)句
2.在一個(gè)文件中,找到含有hello的語(yǔ)句
3.在一個(gè)文件中削咆,找到郵箱為163的所有郵件地址
正則表達(dá)式(regular ?expression)是一種工具牍疏,一種廣泛用于匹配字符串的工具。它用一個(gè)“字符串”來(lái)描述一個(gè)特征拨齐,然后去驗(yàn)證另一個(gè)“字符串”是否符合這個(gè)特征鳞陨。比如 表達(dá)式“ab+”描述的特征是“一個(gè)'a'和任意個(gè)'b'”,那么'ab','abb','abbbbbbbbbb'都符合這個(gè)特征瞻惋。
正則表達(dá)式語(yǔ)法
正則表達(dá)式本質(zhì)上只做一件事厦滤,那就是編寫一個(gè)表達(dá)式“字符串”,然后用這個(gè)字符串去匹配目標(biāo)文本歼狼。核心的核心馁害,都在編寫這個(gè)“字符串”表達(dá)式上面。
re模塊操作
在Python中需要通過(guò)正則表達(dá)式對(duì)字符串進(jìn)行匹配的時(shí)候蹂匹,可以使用一個(gè)模塊,名字為re
普通字符
字母凹蜈、數(shù)字限寞、漢字忍啸、下劃線、以及沒(méi)有特殊定義的符號(hào)履植,都是"普通字符"计雌。正則表達(dá)式中的普通字符,在匹配的時(shí)候,只匹配與自身相同的一個(gè)字符玫霎。
例如:表達(dá)式c凿滤,在匹配字符串a(chǎn)bcde時(shí),匹配結(jié)果是:成功庶近;匹配到的內(nèi)容是c翁脆;匹配到的位置開(kāi)始于2,結(jié)束于3鼻种。(注:下標(biāo)從0開(kāi)始還是從1開(kāi)始反番,因當(dāng)前編程語(yǔ)言的不同而可能不同)
元字符
正則表達(dá)式中使用了很多元字符,用來(lái)表示一些特殊的含義或功能叉钥。
轉(zhuǎn)義字符
一些無(wú)法書(shū)寫或者具有特殊功能的字符罢缸,采用在前面加斜杠""進(jìn)行轉(zhuǎn)義的方法。例如下表所示:
尚未列出的還有問(wèn)號(hào)投队?枫疆、星號(hào)*和括號(hào)等其他的符號(hào)。所有正則表達(dá)式中具有特殊含義的字符在匹配自身的時(shí)候敷鸦,都要使用斜杠進(jìn)行轉(zhuǎn)義息楔。這些轉(zhuǎn)義字符的匹配方法與普通字符類似,也是匹配與之相同的一個(gè)字符轧膘。
預(yù)定義匹配字符集
正則表達(dá)式中的一些表示方法钞螟,可以同時(shí)匹配某個(gè)預(yù)定義字符集中的任意一個(gè)字符。比如谎碍,表達(dá)式\d可以匹配任意一個(gè)數(shù)字鳞滨。雖然可以匹配其中任意字符,但是只能是一個(gè)蟆淀,不是多個(gè)拯啦。
例如表達(dá)式\d\d,在匹配abc123時(shí)熔任,匹配的結(jié)果是:成功褒链;匹配到的內(nèi)容是12;匹配到的位置開(kāi)始于3疑苔,結(jié)束于5甫匹。 (前提是用search來(lái)匹配,用match是匹配不到的)
重復(fù)匹配
前面的表達(dá)式,無(wú)論是只能匹配一種字符的表達(dá)式兵迅,還是可以匹配多種字符其中任意一個(gè)的表達(dá)式抢韭,都只能匹配一次。但是有時(shí)候我們需要對(duì)某個(gè)片段進(jìn)行重復(fù)匹配恍箭,例如手機(jī)號(hào)碼13666666666刻恭,一般的新手可能會(huì)寫成\d\d\d\d\d\d\d\d\d\d\d(注意,這不是一個(gè)恰當(dāng)?shù)谋磉_(dá)式)扯夭,不但寫著費(fèi)勁鳍贾,看著也累,還不一定準(zhǔn)確恰當(dāng)交洗。
這種情況可以使用表達(dá)式再加上修飾匹配次數(shù)的特殊符號(hào){}骑科,不用重復(fù)書(shū)寫表達(dá)式就可以重復(fù)匹配。比如[abcd][abcd]可以寫成[abcd]{2}藕筋。
位置匹配
有時(shí)候纵散,我們對(duì)匹配出現(xiàn)的位置有要求,比如開(kāi)頭隐圾、結(jié)尾伍掀、單詞之間等等。
例如表達(dá)式^aaa在匹配xxx aaa xxx時(shí)暇藏,匹配結(jié)果是:失敗蜜笤。因?yàn)閊要求在字符串開(kāi)始的地方匹配。
表達(dá)式aaa$在匹配xxx aaa xxx時(shí)盐碱,匹配結(jié)果是:失敗把兔。因?yàn)?要求在字符串結(jié)束的地方匹配。
表達(dá)式.\b.在匹配@@@abc時(shí)瓮顽,匹配結(jié)果是:成功县好;匹配到的內(nèi)容是@a;匹配到的位置開(kāi)始于2暖混,結(jié)束于4缕贡。
表達(dá)式\bend\b在匹配weekend,endfor,end時(shí),匹配結(jié)果是:成功拣播;匹配到的內(nèi)容是end晾咪;匹配到的位置開(kāi)始于15,結(jié)束于18贮配。
貪婪與非貪婪模式
在重復(fù)匹配時(shí)谍倦,正則表達(dá)式默認(rèn)總是盡可能多的匹配,這被稱為貪婪模式泪勒。比如昼蛀,針對(duì)文本dxxxdxxxd宴猾,表達(dá)式(d)(\w+)(d)中的\w+將匹配第一個(gè)d和最后一個(gè)d之間的所有字符xxxdxxx〔芮ⅲ可見(jiàn)鳍置,\w+在匹配的時(shí)候,總是盡可能多的匹配符合它規(guī)則的字符送淆。同理,帶有?怕轿、*和{m,n}的重復(fù)匹配表達(dá)式都是盡可能地多匹配偷崩。
但是有時(shí)候,這種模式不是我們想要的結(jié)果撞羽,比如最常見(jiàn)的HTML標(biāo)簽匹配阐斜。假設(shè)有如下的字符串:
我們的意圖是獲取每個(gè)<td></td>標(biāo)簽中的元素內(nèi)容,那么如果你將正則表達(dá)式寫成<td>(.*)</td>的話诀紊,你得到的是<td>蘋果</td><td>桃子</td><td>香蕉</td>這么個(gè)東西谒出,而不是“蘋果”、“桃子”邻奠、“香蕉”笤喳。
在修飾匹配次數(shù)的特殊符號(hào)后再加上一個(gè)?問(wèn)號(hào),則可以使匹配次數(shù)不定的表達(dá)式盡可能少的匹配碌宴,使可匹配可不匹配的表達(dá)式杀狡,盡可能的"不匹配"。如果少匹配就會(huì)導(dǎo)致整個(gè)表達(dá)式匹配失敗的時(shí)候贰镣,與貪婪模式類似呜象,非貪婪模式會(huì)最小限度的再多匹配一些,以使整個(gè)表達(dá)式匹配成功碑隆。
表達(dá)式<td>(.*?)</td>匹配上面的字符串時(shí)恭陡,將只得到<td>蘋果</td>,再次匹配下一個(gè)時(shí)上煤,可以得到<td>桃子</td>休玩,以此類推。
常用正則表達(dá)式
校驗(yàn)數(shù)字的相關(guān)表達(dá)式:
特殊場(chǎng)景的表達(dá)式: