Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用正则表达式和Python将名称与可能的特殊字符匹配?_Python_Regex - Fatal编程技术网

如何使用正则表达式和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()在您的案例中返回一个元组,并从左向右扫描
如果模式中存在一个或多个组,则返回组列表;如果模式有多个组,这将是一个元组列表。