捕獲分組通常用數(shù)字編號來標(biāo)識揽祥,但這樣有幾個(gè)問題:
- 數(shù)字編號不夠直觀赐俗,雖然規(guī)則是“從左到右按照開括號出現(xiàn)的順序計(jì)數(shù)”几苍,但括號多了難免混淆
- 引用時(shí)不夠方便蚀浆,有可能出現(xiàn)二義性
未解決這類問題,一些語言和工具提供了命名分組(named grouping)香追,可已經(jīng)它看作另一種捕獲分組怜奖,但是標(biāo)識是容易記憶和辨別的名字,而不是數(shù)字編號翅阵。
命名分組的記法并不復(fù)雜歪玲。在Python中是?P<name>
來分組的,其中name
是賦予這個(gè)分組的名字掷匠。使用時(shí)再用group(name)
來獲得對應(yīng)分組匹配的文本滥崩。
例3-32 命名分組捕獲
nameRegex = re.compile(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})')
result = nameRegex.search('2018-12-17')
print(result.group('year')) # 2018
print(result.group('month')) # 12
print(result.group('day')) # 17
因?yàn)閿?shù)字編號分組的歷史更長,為保證向后兼容讹语,即便使用了命名分組钙皮,每個(gè)分組同時(shí)也具有數(shù)字編號,其編號規(guī)則沒有變化顽决。
例3-33 命名分組捕獲時(shí)仍保留了數(shù)字編號
nameRegex = re.compile(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})')
result = nameRegex.search('2018-12-17')
print(result.group('year'), result.group(1)) # 2018 2018
print(result.group('month'), result.group(2)) # 12 12
print(result.group('day'), result.group(3)) # 17 17
在Python中短条,如果使用了命名分組,在表達(dá)式中反向引用時(shí)才菠,必須使用(?P=name)
的記法茸时;而要進(jìn)行正則表達(dá)式替換,則需要寫作\g<name>
赋访,其中的name
是分組的名字可都。
例3-34 命名分組的引用方法
print(re.search(r'(?P<char>[a-z])(?P=char)', 'aa')) # 'aa'
print(re.search(r'([a-z])(\1)', 'aa')) # 'aa'
print(re.sub(r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})', '\g<day>_\g<month>_\g<year>', '2018-12-17')) # 17_12_2018