捕獲組
使用小括號(hào)指定一個(gè)子表達(dá)式后,匹配這個(gè)子表達(dá)式的文本(也就是此分組捕獲的內(nèi)容)可以在表達(dá)式或其它程序中作進(jìn)一步的處理殖侵。默認(rèn)情況下,每個(gè)捕獲組會(huì)自動(dòng)擁有一個(gè)組號(hào),規(guī)則是:從左向右和屎,以分組的左括號(hào)為標(biāo)志,第一個(gè)出現(xiàn)的分組的組號(hào)為1春瞬,第二個(gè)為2柴信,以此類推。 也可以自己指定子表達(dá)式的組名宽气。這樣在表達(dá)式或程序中可以直接引用組名随常,當(dāng)然也可以繼續(xù)使用組號(hào)。但如果正則表達(dá)式中同時(shí)存在普通捕獲組和命名捕獲組萄涯,那么捕獲組的編號(hào)就要特別注意绪氛,編號(hào)的規(guī)則是先對(duì)普通捕獲組進(jìn)行編號(hào),再對(duì)命名捕獲組進(jìn)行編號(hào)涝影。詳細(xì)語法如下:
1.(pattern): 匹配pattern并捕獲結(jié)果枣察,自動(dòng)設(shè)置組號(hào)。e.g.
(abc)+d : 匹配到abcd或者abcabcd
2.(?<name>pattern)或(?'name'pattern) : 匹配pattern并捕獲結(jié)果燃逻,設(shè)置name為組名序目。
3.\num: 對(duì)捕獲組的反向引用。其中 num 是一個(gè)正整數(shù)伯襟。e.g.
(\w)(\w)\2\1: 匹配到abba
4.\k< name >或\k' name ' : 對(duì)命名捕獲組的反向引用猿涨。其中 name 是捕獲組名。e.g.
(?<group>\w)abc\k<group> : 匹配到xabcx
非捕獲組
非捕獲組只匹配結(jié)果姆怪,但不捕獲結(jié)果嘿辟,也不會(huì)分配組號(hào)舆瘪。
- (?:pattern) : 匹配pattern,但不捕獲匹配結(jié)果红伦。e.g.:
industr(?:y|ies)
可以匹配到'industry'或'industries'
2.(?=pattern): 零寬度正向預(yù)查(正向零寬斷言)英古,匹配后面跟的是pattern的內(nèi)容,不匹配pattern昙读,也不捕獲匹配結(jié)果召调。e.g.
Windows(?=95|98|NT|2000)
能匹配到"Windows2000" 中的 "Windows"
不能匹配到 "Windows3.1" 中的 "Windows"
3.(?!pattern): 零寬度負(fù)向預(yù)查(負(fù)向零寬斷言),匹配后面跟的不是pattern的內(nèi)容蛮浑,不匹配pattern唠叛,不捕獲匹配結(jié)果。e.g.:
Windows(?!95|98|NT|2000)
能匹配 "Windows3.1" 中的 "Windows"
不能匹配 "Windows2000" 中的 "Windows"
4.(?<=pattern): 零寬度正向回查(正向零寬斷言)沮稚,匹配前面是pattern的內(nèi)容艺沼,不匹配pattern,不捕獲匹配結(jié)果蕴掏。e.g.
(?<=Office|Word|Excel)2000
能匹配 " Office2000" 中的 "2000"
不能匹配 "Windows2000" 中的 "2000"
5.(?<!pattern): 零寬度負(fù)向回查(負(fù)向零寬斷言)障般,匹配前面不是pattern的內(nèi)容,不匹配pattern盛杰,不捕獲匹配結(jié)果挽荡。e.g.:
(?<!Office|Word|Excel)2000
能匹配 " Windows2000" 中的 "2000"
不能匹配 " Office2000" 中的 "2000"
正則表達(dá)式中的注釋
(?#comment) :這種類型的分組不對(duì)正則表達(dá)式的處理產(chǎn)生任何影響
python對(duì)于非捕獲組的支持
python中的re模塊可以支持上述非捕獲組1、2即供、3樣式的正則定拟,但是不支持4、5樣式的正則逗嫡,4青自、5樣式的正則會(huì)報(bào)錯(cuò)“sre_constants.error: look-behind requires fixed-width pattern”,意思是“回查需要定長(zhǎng)的模式”驱证,所謂定長(zhǎng)延窜,如“(?<=Office.{4})2000”即為定長(zhǎng),“(?<=Office.*)2000”即為不定長(zhǎng)雷滚;
4樣式的正則可以改寫為:(?:(?<=Office)|(?<=Word)|(?<=Excel))2000"需曾。
整理自:http://www.cnblogs.com/wuhong/archive/2011/02/18/1957017.html