你可以从编译后的表达式中得到这些信息:
>>> pattern = re.compile(r'(?P<name>\w+)|(?P<number>\d+)')
>>> pattern.groupindex
{'name': 1, 'number': 2}
这使用RegexObject.groupindex attribute:
将(?P<id>) 定义的任何符号组名称映射到组编号的字典。如果模式中没有使用符号组,则字典为空。
如果您只能访问匹配对象,则可以使用MatchObject.re attribute 访问模式:
>>> a = list(re.finditer(r'(?P<name>\w+)|(?P<number>\d+)', 'Ala ma kota'))
>>> a[0]
<_sre.SRE_Match object at 0x100264ad0>
>>> a[0].re.groupindex
{'name': 1, 'number': 2}
如果您只想知道匹配的组,请查看该值; None 表示比赛中从未使用过的组:
>>> a[0].groupdict()
{'name': 'Ala', 'number': None}
number 组从未用于匹配任何内容,因为它的值是 None。
然后您可以通过以下方式找到正则表达式中使用的名称:
names_used = [name for name, value in matchobj.groupdict().iteritems() if value is not None]
或者如果只有一个组可以匹配,你可以使用MatchObject.lastgroup:
name_used = matchobj.lastgroup
顺便说一句,你的正则表达式有一个致命的缺陷; \d 匹配的所有内容也与\w 匹配。你永远不会看到 number 在 name 可以首先匹配的地方使用。反转模式以避免这种情况:
>>> for match in re.finditer(r'(?P<name>\w+)|(?P<number>\d+)', 'word 42'):
... print match.lastgroup
...
name
name
>>> for match in re.finditer(r'(?P<number>\d+)|(?P<name>\w+)', 'word 42'):
... print match.lastgroup
...
name
number
但要考虑到以数字开头的单词仍然会使您的简单情况感到困惑:
>>> for match in re.finditer(r'(?P<number>\d+)|(?P<name>\w+)', 'word42 42word'):
... print match.lastgroup, repr(match.group(0))
...
name 'word42'
number '42'
name 'word'