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