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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 22:57:20