python正则表达式模块_Python正则表达式模块(re模块)
Python是我接觸到的第一門(mén)編程語(yǔ)言,雖然它足夠簡(jiǎn)單,但是對(duì)于當(dāng)時(shí)剛剛接觸編程語(yǔ)言的我來(lái)說(shuō)還是有些難度的,于是只是了解了一些Python的基本語(yǔ)法,稍微深入一點(diǎn)的地方都沒(méi)怎么了解。不過(guò),到現(xiàn)在為止,我已經(jīng)接觸了這門(mén)編程語(yǔ)言一年了,期間把Python各種特性,各種包都看過(guò),了解過(guò)。不過(guò)對(duì)于正則表達(dá)式這塊仍然一知半解,加上前段時(shí)間幫助聰哥整理了<深入Python3>的中文維護(hù)版,湊上這個(gè)國(guó)慶假期,于是來(lái)簡(jiǎn)單的聊一聊這個(gè)正則表達(dá)式模塊--re。
首先是字符串中字符的替換問(wèn)題,如果使用原生的Python方法,一般就是采用 replace 方法,下面我們采用re.sub方法同它進(jìn)行比較。
第一個(gè)案例:我們的目標(biāo)是把ROAD替換成RD.
似乎replace方法工作的不錯(cuò)阿,完成了我給定的任務(wù)。如果是下面這個(gè)例子呢?
這里很明顯已經(jīng)出現(xiàn)了問(wèn)題,因?yàn)檫@個(gè)字符串中含有BROAD,其中也有ROAD四個(gè)字符,但是我們的目標(biāo)并沒(méi)有要求替換它。這里它也被替換成了BRD. ,這已經(jīng)足以說(shuō)明replace方法的局限性。當(dāng)然,如果我們?cè)O(shè)計(jì)得當(dāng),這個(gè)方法也能用。
使用切片,我們也能做到這一點(diǎn),僅僅把最后面的四個(gè)字符替換。不過(guò),這種算法也有局限性,如果我們要將STREET 替換為ST. ,我們是不是應(yīng)該保留最后面的六個(gè)字符?這樣,每次替換都要修改代碼,并且很容易造成錯(cuò)誤,對(duì)于調(diào)試來(lái)說(shuō)很麻煩。
那么讓我們來(lái)試一下re.sub方法。
注意第一個(gè)參數(shù),‘ROAD$’,其中美元符代表了字符串的結(jié)尾,也就是說(shuō)匹配結(jié)尾的ROAD字符。同樣的 ,^ 代表字符串的開(kāi)頭。我很快發(fā)現(xiàn), 有時(shí)候ROAD不一定在字符串的結(jié)尾,比如: s = '100 BROAD ROAD APT.3',此時(shí),上面的方法就不適用了,沒(méi)關(guān)系,我們還有\(zhòng)b。
是不是很神奇?\b在左側(cè)意味著左側(cè)是個(gè)空格,在右側(cè)意味著右側(cè)是個(gè)空格,因此兩側(cè)\b就是說(shuō),ROAD是一個(gè)獨(dú)立的單詞。也就是把獨(dú)立的ROAD換成RD.,這和我們的目標(biāo)相同。
第二個(gè)案例:羅馬數(shù)字的匹配
在羅馬數(shù)字中,用七個(gè)字母組合來(lái)表示數(shù)字。
I = 1
V = 5
X = 10
L = 50
C = 100
D = 500
M = 1000
下面是幾個(gè)通常的規(guī)則來(lái)構(gòu)成羅馬數(shù)字:
大部分時(shí)候用字符相疊加來(lái)表示數(shù)字。I是1, II是2, III是3。VI是6(挨個(gè)看來(lái),是“5 和 1”的組合),VII是7,VIII是8。
含有10的字符(I,X,C和M)最多可以重復(fù)出現(xiàn)三個(gè)。為了表示4,必須用同一位數(shù)的下一個(gè)更大的數(shù)字5來(lái)減去一。不能用IIII來(lái)表示4,而應(yīng)該是IV(意思是比5小1)。40寫(xiě)做XL(比50小10),41寫(xiě)做XLI,42寫(xiě)做XLII,43寫(xiě)做XLIII,44寫(xiě)做XLIV(比50小10并且比5小1)。
有些時(shí)候表示方法恰恰相反。為了表示一個(gè)中間的數(shù)字,需要從一個(gè)最終的值來(lái)減。比如:9需要從10來(lái)減:8是VIII,但9確是IX(比10小1),并不是VIII(I字符不能重復(fù)4次)。90是XC,900是CM。
表示5的字符不能在一個(gè)數(shù)字中重復(fù)出現(xiàn)。10只能用X表示,不能用VV表示。100只能用C表示,而不是LL。
羅馬數(shù)字是從左到右來(lái)計(jì)算,因此字符的順序非常重要。DC表示600,而CD完全是另一個(gè)數(shù)字400(比500小100)。CI是101,IC不是一個(gè)羅馬數(shù)字(因?yàn)槟悴荒軓?00減1,你只能寫(xiě)成XCIX,表示比100小10,且比10小1)。
對(duì)于千位數(shù)的匹配:
我們?cè)O(shè)定匹配模式是三個(gè)M,其中‘?’代表了這個(gè)參數(shù)是可選的,即三個(gè)可選的M參數(shù)。
第一次匹配M時(shí),從^(字符串開(kāi)頭)開(kāi)始匹配,匹配到一個(gè)M,另外兩個(gè)由于是可選的,因此跳過(guò),然后匹配到$(字符串結(jié)尾),匹配完成,返回一個(gè)匹配對(duì)象。第二,第三次匹配軍成功。第四次匹配時(shí),由于最多只能匹配上三個(gè)M,而給了四個(gè)M,因此在匹配完三個(gè)M時(shí)尋找$時(shí),尋找不到,因此匹配失敗,返回None。
值得注意的時(shí),因?yàn)槿齻€(gè)參數(shù)都是可選的,因此空字符串也能匹配上。
對(duì)于百位數(shù)的匹配:
100 = C
200 = CC
300 = CCC
400 = CD
500 = D
600 = DC
700 = DCC
800 = DCCC
900 = CM
因此有以下四種匹配模式:
CM
CD
可能有0到3個(gè)字符C(0個(gè)表示千位為0)。
D緊跟在0到3個(gè)字符C的后面。
其中后兩種可以合并為一種:
一個(gè)可選的D,后面跟著0到3個(gè)字符C。
此時(shí),匹配模式中即包含千位,也包含百位。 ‘|’就是邏輯運(yùn)算中或的意思,當(dāng)出現(xiàn)幾種情況并行時(shí)使用,當(dāng)其中一個(gè)條件滿(mǎn)足時(shí),就停止執(zhí)行后面的條件。
同樣可以發(fā)現(xiàn),空字符也是可以被匹配上的。
同理,我們分析了十位和個(gè)位的法則,也可以匹配上。
正則表達(dá)式非常強(qiáng)大,但它也并不是解決每一個(gè)問(wèn)題的正確答案。你需要更多的了解來(lái)判斷哪些情況適合使用正則表達(dá)式。某些時(shí)候它可以解決你的問(wèn)題,某些時(shí)候它可能帶來(lái)更多的問(wèn)題。
預(yù)留問(wèn)題:
1.“115.28.66.99[port=8080]”,這個(gè)字符串表示IP地址為115.28.66.99的服務(wù)器的8080端口是打開(kāi)的,請(qǐng)用程序解析此字符串,然后打印出“IP地址為***的服務(wù)器的***端口是打開(kāi)的”。
2.“115.28.66.99[port=21,type=ftp]”,這個(gè)字符串表示IP地址為115.28.66.99的服務(wù)器的21端口提供的是ftp服務(wù),其中如果“,type=ftp”部分被省略,則默認(rèn)為http服務(wù)。請(qǐng)用程序解析此字符串,然后打印出“IP地址為***的服務(wù)器的***端口提供的服務(wù)為***”
總結(jié)
以上是生活随笔為你收集整理的python正则表达式模块_Python正则表达式模块(re模块)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cas 单点登录_47 使用cas完成单
- 下一篇: websocket python爬虫_p