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