如何使用正则表达式和Python将名称与可能的特殊字符匹配?
我试图匹配像约翰·威廉姆斯和凯文·奥麦克唐纳·史密斯这样的名字,但不是凯文·奥麦克唐纳、凯文·奥麦克唐纳·史密斯·威廉姆斯或凯文·史密斯·约翰·史密斯。我的尝试代码如下:如何使用正则表达式和Python将名称与可能的特殊字符匹配?,python,regex,Python,Regex,我试图匹配像约翰·威廉姆斯和凯文·奥麦克唐纳·史密斯这样的名字,但不是凯文·奥麦克唐纳、凯文·奥麦克唐纳·史密斯·威廉姆斯或凯文·史密斯·约翰·史密斯。我的尝试代码如下: r1 = re.findall(r"(([A-z]+')?[A-z]+)([,]?[\s-](([A-z]+')?[A-z]+)){0,2}", "Kevin O'McDonald-Smith") print(r1) 这将产生: [('Kevin', '', '-Smith', 'Smith', "O'")] 我期待着:
r1 = re.findall(r"(([A-z]+')?[A-z]+)([,]?[\s-](([A-z]+')?[A-z]+)){0,2}", "Kevin O'McDonald-Smith")
print(r1)
这将产生:
[('Kevin', '', '-Smith', 'Smith', "O'")]
我期待着:
[("Kevin O'McDonald-Smith")]
我已经在上测试了这个正则表达式,但是我使用Python的
re
库的代码给出了一个我不期望的输出。也许最简单的方法是使用一个否定的前瞻断言,该断言强制在名称中不出现超过一个特殊字符:
name = "Kevin O'McDonald-Smith-Williams"
if re.search(r'^(?!.*[\'-].*[\'-]).*$', name):
print("MATCH")
else:
print("NO MATCH")
这将打印:不匹配
负前瞻(?!.[\'-].[\'-])
声明名称中不出现两个(或更多)特殊字符。仍然允许使用一个特殊字符,包括空格。re.findall()在您的案例中返回一个元组,并从左向右扫描如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。