日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python正则表达式模块_Python正则表达式模块(re模块)

發(fā)布時(shí)間:2024/2/28 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python正则表达式模块_Python正则表达式模块(re模块) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。