我正在编写一个python正则表达式,试图捕获人名。
它们可以采用first_name last_name
或last_name, first_name
的形式。
这是我的正则表达式:
(?P<first>\w+) (?P<last>\w+)|(?P<last>\w+), (?P<first>\w+)
但是,它会导致一个子模式命名错误。有没有办法解决这个问题?
发布于 2018-09-30 14:41:03
您可以仅对PyPi regex module执行您想要的操作,因为它允许在单个模式中使用相同名称的捕获组:
import regex
sz = ["first_name last_name","last_name, first_name"]
for s in sz:
print(regex.search(r'(?P<first>\w+) (?P<last>\w+)|(?P<last>\w+), (?P<first>\w+)', s).groupdict())
# => {'last': 'last_name', 'first': 'first_name'}
# => {'last': 'last_name', 'first': 'first_name'}
请参阅Python demo。
否则,如果您的输入总是这样,您可以交换名字和姓氏,删除逗号,然后只拆分字符串:
name, surname = re.sub(r'^(\w+),\s+(\w+)$', r'\2 \1', s).split()
# => first_name last_name
# => first_name last_name
Another alternative:使用简单的编号捕获组和常规交替,然后拼接相应的捕获:
import re
sz = ["first_name last_name","last_name, first_name"]
for s in sz:
m = re.search(r'(\w+),\s+(\w+)|(\w+)\s+(\w+)', s)
if m:
surname = "{}{}".format(m.group(1) or '', m.group(4) or '')
name = "{}{}".format(m.group(2) or '', m.group(3) or '')
print("{} {}".format(name, surname))
else:
print("No match")
在这里,r'(\w+),\s+(\w+)|(\w+)\s+(\w+)'
的姓氏在组1或组4,名在组2或组3,加入这些组后,您会得到匹配的组(其中一个总是None
,因此拼接时需要or ''
)。
发布于 2018-09-29 22:35:40
试试这样的东西,
请注意,Python需要唯一的捕获组名称。
r"(?P<first1>\w+)[ ](?P<last1>\w+)|(?P<last2>\w+),[ ](?P<first2>\w+)"
https://regex101.com/r/FUYxTb/1
(?P<first1> \w+ ) # (1)
[ ]
(?P<last1> \w+ ) # (2)
|
(?P<last2> \w+ ) # (3)
, [ ]
(?P<first2> \w+ ) # (4)
https://stackoverflow.com/questions/52572918
复制相似问题