python的re模塊有一個(gè)分組功能。所謂的分組就是去已經(jīng)匹配到的內(nèi)容里面再篩選出需要的內(nèi)容,相當(dāng)于二次過(guò)濾。
實(shí)現(xiàn)分組靠圓括號(hào)(),而獲得分組的內(nèi)容靠的是group(),groups(),groupdict()方法。
re模塊里的幾個(gè)重要方法在分組上,有不同的表現(xiàn)形式,需要區(qū)別對(duì)待。
import re
origin = "hasdfi123123safd"
# 不分組時(shí)的情況
r = re.match("h\w+", origin)
print(r.group()) # 獲取匹配到的整體結(jié)果
print(r.groups()) # 獲取模型中匹配到的分組結(jié)果元組
print(r.groupdict()) # 獲取模型中匹配到的分組中所有key的字典
結(jié)果:
hasdfi123123safd
()
{}
import re
origin = "hasdfi123123safd123"
# 有分組
r = re.match("h(\w+).*(?P<name>\d)$", origin)
print(r.group()) # 獲取匹配到的整體結(jié)果
print(r.group(1)) # 獲取匹配到的分組1的結(jié)果
print(r.group(2)) # 獲取匹配到的分組2的結(jié)果
print(r.groups()) # 獲取模型中匹配到的分組結(jié)果元組
print(r.groupdict()) # 獲取模型中匹配到的分組中所有key的字典
執(zhí)行結(jié)果:
hasdfi123123safd123
asdfi123123safd12
3
('asdfi123123safd12', '3')
{'name': '3'}
說(shuō)明??:
(1)正則表達(dá)式h(\w+).*(?P<name>\d)$
中有2個(gè)小括號(hào),表示它分了2個(gè)小組,在匹配的時(shí)候是拿整體的表達(dá)式去匹配的,而不是拿小組去匹配的。
(2)(\w+)
表示這個(gè)小組內(nèi)是1到多個(gè)字母數(shù)字字符,相當(dāng)于匹配包括下劃線的任何單詞字符。等價(jià)于'[A-Za-z0-9_]'
。
(3)(?P<name>\d)
中?P<name>
是個(gè)正則表達(dá)式的特殊語(yǔ)法,表示給這個(gè)小組取了個(gè)叫“name”的名字,?P<xxxx>
是固定寫法。\d
匹配一個(gè)數(shù)字字符。等價(jià)于[0-9]
。
import re
origin = "sdfi1ha23123safd123" # 注意這里對(duì)匹配對(duì)象做了下調(diào)整
# 有分組
r = re.search("h(\w+).*(?P<name>\d)$", origin)
print(r.group())
print(r.group(0))
print(r.group(1))
print(r.group(2))
print(r.groups())
print(r.groupdict())
執(zhí)行結(jié)果:
ha23123safd123
ha23123safd123
a23123safd12
3
('a23123safd12', '3')
{'name': '3'}
說(shuō)明??:表現(xiàn)得和match()方法基本一樣。
re.match只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個(gè)字符串,直到找到一個(gè)匹配。
舉例如下:
#!/usr/bin/python
import re
line = "Cats are smarter than dogs";
matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
print "match --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
print "search --> matchObj.group() : ", matchObj.group()
else:
print "No match!!"
以上代碼執(zhí)行結(jié)果如下:
No match!!
search --> matchObj.group() : dogs
正則表達(dá)式實(shí)例:
#!/usr/bin/python
import re
line = "Cats are smarter than dogs"
matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)
if matchObj:
print "matchObj.group() : ", matchObj.group()
print "matchObj.group(1) : ", matchObj.group(1)
print "matchObj.group(2) : ", matchObj.group(2)
else:
print "No match!!"
說(shuō)明??:關(guān)于正則表達(dá)式r'(.*) are (.*?) .*'
(1)首先,這是一個(gè)字符串,前面的一個(gè) r 表示字符串為非轉(zhuǎn)義的原始字符串,讓編譯器忽略反斜杠,也就是忽略轉(zhuǎn)義字符。但是這個(gè)字符串里沒有反斜杠,所以這個(gè) r 可有可無(wú)。
(2)(.) 第一個(gè)匹配分組,. 代表匹配除換行符之外的所有字符。
(3)(.?) 第二個(gè)匹配分組,.? 后面多個(gè)問(wèn)號(hào),代表非貪婪模式,也就是說(shuō)只匹配符合條件的最少字符。
(4)后面的一個(gè) .* 沒有括號(hào)包圍,所以不是分組,匹配效果和第一個(gè)一樣,但是不計(jì)入匹配結(jié)果中。
(5)matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符
matchObj.group(1) 得到第一組匹配結(jié)果,也就是(.*)匹配到的
matchObj.group(2) 得到第二組匹配結(jié)果,也就是(.*?)匹配到的
因?yàn)橹挥衅ヅ浣Y(jié)果中只有兩組,所以如果填 3 時(shí)會(huì)報(bào)錯(cuò)。
劉江python教程
python正則表達(dá)式01-re
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
文章名稱:python中re模塊簡(jiǎn)析-創(chuàng)新互聯(lián)
URL分享:http://aaarwkj.com/article22/gigcc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、關(guān)鍵詞優(yōu)化、企業(yè)建站、定制開發(fā)、App開發(fā)、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容