如何修改Python正则表达式匹配敬称引导的完整人名?
正则匹配带敬称全名解决方案
你遇到的问题来自两个正则使用误区:
- 原正则包含两个独立捕获组,
re.findall在检测到模式中有捕获组时,会返回各组匹配结果组成的元组,而非完整匹配字符串 - 名字部分的分组量词放在分组外侧,只会保留最后一个匹配到的名字段,无法匹配多段全名
修改方案
把内部不需要单独提取的分组改为非捕获组(语法为(?:模式)),同时调整名字匹配逻辑支持多段人名,修改后完整代码如下:
import re # 用with上下文管理器操作文件更安全,避免资源泄漏 with open("funeral.txt", "r", encoding="utf-8") as file: text = file.read() # 优化后的正则:支持Mr/Ms/Mrs/Senator等常见敬称,可匹配连续多段首字母大写的人名 honorific_names = r"(?:Mr|Ms|Mrs|Senator)\.?\s+(?:[A-Z][a-z]*[.\-']?\s?)+" # 匹配后去除人名末尾多余的空格 result = [match.strip() for match in re.findall(honorific_names, text)] print(result)
运行后即可得到预期输出:['Mrs. Meghan', 'Mrs. Oprah Winfrey', 'Mr. Boris Johnson', 'Ms. Megan Specia']
内容的提问来源于stack exchange,提问作者Qunoot K
相关产品推荐
相关产品推荐

