You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:45:35