一般狀況下,分組是用一對圓括號「()」括起來的正則表達式,匹配出的內容就表示一個分組。分組有一個例外的狀況,分組也能夠不使用圓括號,而是使用 | 元字符來表示分組,| 的兩側是兩個分組。html
當使用圓括號表示分組時,從正則表達式的左邊開始看,看到的第一個左括號「(」表示第一個分組,第二個"("表示第二個分組,依次類推,須要注意的是,有一個隱含的全局分組(就是0),就是整個正則表達式。默認狀況下,正則表達式爲每一個分組自動分配一個組號,規則是:組號從1開始,從左向右,組號依次加1(base+1),例如,第一個分組的組號爲1,第二個分組的組號爲2,以此類推。正則表達式
分組不只有編號,還能爲分組設置別名,在Python中,使用(?P<name>exp)爲正則表達式exp設置別名。spa
匹配分組的元字符:code
分組引用,是指在表達式中,重複使用正則表達式,使正則表達式的寫法更簡潔。htm
分組定義的三種形式:blog
1,經過組號引用分組文檔
在正則表達式前面定義一個分組(exp),在表達式的後面,可以經過組號引用該分組的表達式,引用分組的語法是:\group_number;get
例如:\b(\w+)\b\s+\1\b,在該正則表達式中,只存在一個分組(\w+),組號是1,在該分組的後面,使用\1來引用該分組,將\1替換爲分組的子表達式,等價於:\b(\w+)\b\s+(\w+)\b。class
2,經過分組名引用分組test
在正則表達式中,可以對分組命名,命名的分組格式:(?P<name>exp),分組名是name,經過name來引用該分組的格式是:(?p=group_name),經過分組名和組號引用分組,其文本匹配的行爲是同樣的。
例如:\b(?P<word>\w+)\b\s+(?P=word)\b,在該分組的後面中,使用(?P=word)引用該分組,把(?P=word)替換爲分組的子表達式,等價於:\b(\w+)\b\s+(\w+)\b。
3,沒法引用的分組
(?:exp):使用這種語法定義的分組,不能引用,只能在當前的位置匹配文本,正則表達式不爲該分組自動分配組號。
下面使用Python的re模塊來演示如何使用分組。
1,匹配任意分組
>>> out=re.match('[0-9]?\d$|100','08') >>> out <re.Match object; span=(0, 2), match='08'>
2,使用()定義分組
>>> out=re.match('\w{4,20}@(163|qq|126)\.com','test@qq.com') >>> out <re.Match object; span=(0, 11), match='test@qq.com'>
3,爲分組命名,並經過別名來引用分組
>>> out=re.match(r"<(?P<name1>\w*)><(?P<name2>h[1-5])>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.baidu.com</h1></html>") >>> out <re.Match object; span=(0, 35), match='<html><h1>www.baidu.com</h1></html>'>
參考文檔: