# 命名捕获组

正则表达式中的命名捕获组是指在一个正则表达式中通过给捕获组命名的方式,使得匹配结果可以被以名称的形式引用。在Python中,可以通过(?P<name>...)​的语法来定义一个命名捕获组,其中name​为捕获组的名称,...​是捕获组的正则表达式。比如下面这个例子:

import re

# 匹配一个由字母和数字组成的字符串,其中字母部分用括号捕获
LETTER = r'(?P<letter>[a-zA-Z]+)'
DIGIT = r'(?P<digit>\d+)'
pattern = re.compile('|'.join([LETTER, DIGIT]))
text = 'hello123world456'

scanner = pattern.scanner(text)

g = scanner.match()
print(g.group())            # hello
print(g.groups())           # ('hello', None)
print(g.groupdict())        # {'letter': 'hello', 'digit': None}
print(g.start())            # 0
print(g.end())              # 5
print(g.lastgroup)          # letter
print(g.group('letter'))    # hello
print(g.group('digit'))     # None

print('===============')
while g: # 赶紧期待3.8的:=表达式
    print(g.lastgroup, g.group())
    g = scanner.match()
"""
letter hello
digit 123
letter world
digit 456
"""
print('===============')

ls = pattern.findall(text)
print(ls)                   # [('hello', ''), ('', '123'), ('world', ''), ('', '456')]

Match​对象中我们可以通过lastgroup​属性来获取最后一个匹配的捕获组的名称,同时可以根据Match​对象的group​属性整个匹配对象或指定子组的匹配字符串。