正则表达式命名组

时间:2018-09-30 03:14:33

标签: python regex

我想要一个正则表达式,以第一个和最后一个命名组捕获“ James Allen”和“ Allen,James”之类的名称。 这是我所拥有的:

(?P<first>\w+), (?P<last>\w+)|(?P<last>\w+) (?P<first>\w+)

但是会导致子模式命名错误。我如何解决它,使其仅匹配一种模式。我要保留组名“ first”和“ last”。

1 个答案:

答案 0 :(得分:0)

命名的符号组需要一个名称。格式为(?P<name>...)。在您的示例中,您忘记为组提供名称。

不幸的是,组名不能重复使用,因此以下是错误。

re.compile(r'(?P<last>\w+), (?P<first>\w+)|(?P<first>\w+) (?P<last>\w+)')
# sre_constants.error: redefinition of group name 'first' ...

发生上述错误是因为re不够聪明,无法知道每个名称中只有一个会被匹配。因此,您将必须捕获模式,然后提取firstlast

import re

def get_name(name):
    match = re.match(r'(\w+), (\w+)|(\w+) (\w+)', name)

    return {'first': match[2] or match[3], 'last': match[1] or match[4]}

print(get_name('James Allen'))
print(get_name('Allen, James'))

输出

{'first': 'James', 'last': 'Allen'}
{'first': 'James', 'last': 'Allen'}