我想要一个正则表达式,以第一个和最后一个命名组捕获“ James Allen”和“ Allen,James”之类的名称。 这是我所拥有的:
(?P<first>\w+), (?P<last>\w+)|(?P<last>\w+) (?P<first>\w+)
但是会导致子模式命名错误。我如何解决它,使其仅匹配一种模式。我要保留组名“ first”和“ last”。
答案 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
不够聪明,无法知道每个名称中只有一个会被匹配。因此,您将必须捕获模式,然后提取first
和last
。
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'}