python的re模塊有一個分組功能。所謂的分組就是去已經匹配到的內容裏面再篩選出須要的內容,至關於二次過濾。html
實現分組靠圓括號(),而得到分組的內容靠的是group(),groups(),groupdict()方法。python
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'}
說明⚠️:express
(1)正則表達式h(\w+).*(?P<name>\d)$
中有2個小括號,表示它分了2個小組,在匹配的時候是拿總體的表達式去匹配的,而不是拿小組去匹配的。ide
(2)(\w+)
表示這個小組內是1到多個字母數字字符,至關於匹配包括下劃線的任何單詞字符。等價於'[A-Za-z0-9_]'
。函數
(3)(?P<name>\d)
中?P<name>
是個正則表達式的特殊語法,表示給這個小組取了個叫「name」的名字,?P<xxxx>
是固定寫法。\d
匹配一個數字字符。等價於[0-9]
。code
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()方法基本同樣。htm
re.match只匹配字符串的開始,若是字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。對象
舉例以下:blog
#!/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 時會報錯。