您好,登錄后才能下訂單哦!
python的re模塊有一個分組功能。所謂的分組就是去已經匹配到的內容里面再篩選出需要的內容,相當于二次過濾。
實現分組靠圓括號(),而獲得分組的內容靠的是group(),groups(),groupdict()方法。
re模塊里的幾個重要方法在分組上,有不同的表現形式,需要區別對待。
import re
origin = "hasdfi123123safd"
# 不分組時的情況
r = re.match("h\w+", origin)
print(r.group()) # 獲取匹配到的整體結果
print(r.groups()) # 獲取模型中匹配到的分組結果元組
print(r.groupdict()) # 獲取模型中匹配到的分組中所有key的字典
結果:
hasdfi123123safd
()
{}
import re
origin = "hasdfi123123safd123"
# 有分組
r = re.match("h(\w+).*(?P<name>\d)$", origin)
print(r.group()) # 獲取匹配到的整體結果
print(r.group(1)) # 獲取匹配到的分組1的結果
print(r.group(2)) # 獲取匹配到的分組2的結果
print(r.groups()) # 獲取模型中匹配到的分組結果元組
print(r.groupdict()) # 獲取模型中匹配到的分組中所有key的字典
執行結果:
hasdfi123123safd123
asdfi123123safd12
3
('asdfi123123safd12', '3')
{'name': '3'}
說明??:
(1)正則表達式h(\w+).*(?P<name>\d)$
中有2個小括號,表示它分了2個小組,在匹配的時候是拿整體的表達式去匹配的,而不是拿小組去匹配的。
(2)(\w+)
表示這個小組內是1到多個字母數字字符,相當于匹配包括下劃線的任何單詞字符。等價于'[A-Za-z0-9_]'
。
(3)(?P<name>\d)
中?P<name>
是個正則表達式的特殊語法,表示給這個小組取了個叫“name”的名字,?P<xxxx>
是固定寫法。\d
匹配一個數字字符。等價于[0-9]
。
import re
origin = "sdfi1ha23123safd123" # 注意這里對匹配對象做了下調整
# 有分組
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())
執行結果:
ha23123safd123
ha23123safd123
a23123safd12
3
('a23123safd12', '3')
{'name': '3'}
說明??:表現得和match()方法基本一樣。
re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。
舉例如下:
#!/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!!"
以上代碼執行結果如下:
No match!!
search --> matchObj.group() : dogs
正則表達式實例:
#!/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!!"
說明??:關于正則表達式r'(.*) are (.*?) .*'
(1)首先,這是一個字符串,前面的一個 r 表示字符串為非轉義的原始字符串,讓編譯器忽略反斜杠,也就是忽略轉義字符。但是這個字符串里沒有反斜杠,所以這個 r 可有可無。
(2)(.) 第一個匹配分組,. 代表匹配除換行符之外的所有字符。
(3)(.?) 第二個匹配分組,.? 后面多個問號,代表非貪婪模式,也就是說只匹配符合條件的最少字符。
(4)后面的一個 .* 沒有括號包圍,所以不是分組,匹配效果和第一個一樣,但是不計入匹配結果中。
(5)matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符
matchObj.group(1) 得到第一組匹配結果,也就是(.*)匹配到的
matchObj.group(2) 得到第二組匹配結果,也就是(.*?)匹配到的
因為只有匹配結果中只有兩組,所以如果填 3 時會報錯。
劉江python教程
python正則表達式01-re
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。