正则表达式re模块问题:匹配含可选多姓氏的完整称谓姓名
解决Python re模块匹配单/多部分姓名的问题
问题描述
我搞不懂Python的re模块怎么工作,试了好多次都匹配不了包含单名或多名(含多姓氏)的完整姓名。我现在用的正则表达式是:
the_formmat = re.compile(r"Mr?s?\.?\s[A-Z][a-z]+\s[A-Z][a-z]+") the_string = "this is Mr Samantha Rajapaksa and his wife Mrs. Chalani Rajapaksa. his fathers name is Mr Prabath and his mothers name is Mrs Karunarathnage Dayawathi Bandara Peiris " print(the_formmat.findall(the_string))
我知道?修饰符的用法,但不知道该放哪里才能匹配1个或多个姓氏。当前输出是:
['Mr Samantha Rajapaksa', 'Mrs. Chalani Rajapaksa', 'Mrs Karunarathnage Dayawathi']
期望输出是:
['Mr Samantha Rajapaksa', 'Mrs. Chalani Rajapaksa', 'Mr Prabath', 'Mrs Karunarathnage Dayawathi Bandara Peiris']
问题原因
你的正则固定要求姓名部分必须是「一个单词 + 空格 + 另一个单词」的结构,导致两种情况匹配失败:
- 单名(如
Mr Prabath)没有第二个单词,无法触发匹配 - 多姓氏的姓名(如
Mrs Karunarathnage Dayawathi Bandara Peiris)只能截取前两个单词,后面的部分被忽略
解决方案
修改正则,让姓名部分支持匹配一个或多个大写开头的单词:
the_format = re.compile(r"Mr?s?\.?\s(?:[A-Z][a-z]+(?:\s[A-Z][a-z]+)*)")
关键部分解释
(?:[A-Z][a-z]+):匹配单个大写开头、后续为小写字母的单词(使用非捕获组(?:...)避免生成多余的分组结果)(?:\s[A-Z][a-z]+)*:允许前面的单词结构重复0次或多次——*表示0或多次,既可以匹配单名(重复0次),也能匹配任意多个后续的姓氏/名字部分
运行修改后的代码,输出将与期望完全一致:
['Mr Samantha Rajapaksa', 'Mrs. Chalani Rajapaksa', 'Mr Prabath', 'Mrs Karunarathnage Dayawathi Bandara Peiris']
可选优化
如果需要兼容头衔和姓名之间的多个空格,可以把正则里的\s改成\s+:
the_format = re.compile(r"Mr?s?\.?\s+(?:[A-Z][a-z]+(?:\s[A-Z][a-z]+)*)")
内容的提问来源于stack exchange,提问作者Sandeev Perera
相关产品推荐
相关产品推荐

