Python正则分割连写英文姓名 如何添加Mc前缀不分割规则
问题背景
现有基于正则的连写英文姓名分割逻辑,在处理带Mc前缀的姓氏(如McQueen、McDonald)时会错误拆分,需要用单条正则实现兼容,不改变原有正常姓名的分割效果。
原有测试代码如下:
import re string1 = 'James CameronSteven Spielberg' string2 = 'Martin Scorsese' string3 = 'John McQueen' # 原正则书写存在笔误,漏写后行断言符号<,实际生效逻辑为匹配小写后接大写的边界 result1= re.split(r"(?<=[a-zéè])(?=[A-ZÉÈÊ])", string1) # ['James Cameron','Steven Spielberg'] result2= re.split(r"(?<=[a-zéè])(?=[A-ZÉÈÊ])", string2) # ['Martin Scorsese'] result3= re.split(r"(?<=[a-zéè])(?=[A-ZÉÈÊ])", string3) # ['John Mc', 'Queen'] 错误拆分
修正方案
直接使用如下正则替换原有规则即可:
split_re = r"(?<!Mc)(?<=[a-zéèê])(?=[A-ZÉÈÊ])"
测试效果:
print(re.split(split_re, string1)) # ['James Cameron', 'Steven Spielberg'] 符合预期 print(re.split(split_re, string2)) # ['Martin Scorsese'] 符合预期 print(re.split(split_re, string3)) # ['John McQueen'] 修正错误拆分 print(re.split(split_re, "Ian McKellenTom Hanks")) # ['Ian McKellen', 'Tom Hanks'] 多场景兼容
规则说明
- 保留原有核心分割逻辑:
(?<=[a-zéèê])(?=[A-ZÉÈÊ])匹配「前一个字符为小写字母(含é/è/ê等特殊小写字符)、后一个字符为大写字母(含É/È/Ê等特殊大写字符)」的边界,和原有分割行为完全一致,同时补全了原正则漏写的后行断言<符号,逻辑更严谨,不会出现意外匹配。 - 新增Mc前缀例外:通过负向后行断言
(?<!Mc),直接排除「分割点前两个字符为Mc」的匹配位置,刚好避开Mc前缀后大写字母触发的错误拆分,不需要额外循环判断或后置处理。
内容的提问来源于stack exchange,提问作者athos
相关产品推荐
相关产品推荐

