求助:用于清理姓名变体的Python re.compile正则表达式方案
姓名清理正则解决方案
针对你的需求,单一正则确实很难覆盖所有场景,推荐用多步正则替换来逐步清理,每一步处理特定的姓名变体,逻辑更清晰且易调试:
处理步骤及代码
import re def clean_name(name): # 1. 移除所有带引号的昵称(如"Lady Gaga"、"Chaz") name = re.sub(r'"[^"]+"', '', name) # 2. 移除括号内的婚前名/曾用名(如(Baldwin-)、(Irene-)) name = re.sub(r'\([a-zA-Z-]+\)', '', name) # 3. 保留合法后缀,移除贵族头衔及后续内容 # 先处理合法后缀:去掉标点并调整位置 name = re.sub(r',\s+(Jr|Sr|I{1,3}|IV|V)\.?', r' \1', name) # 移除非后缀的头衔(如Duke)及后续内容 name = re.sub(r',\s+[A-Za-z]+.*', '', name) # 4. 提取名和姓:处理单名、正常姓名两种情况 parts = re.findall(r'[A-Za-z\'-]+', name) if len(parts) == 0: return '' elif len(parts) == 1: return parts[0] else: return f"{parts[0]} {parts[-1]}"
测试用例验证
代入你的测试用例,结果完全符合预期:
Sarah Michelle Gellar→Sarah Gellar✅Leslie Marie DeGuzman Santorini→Leslie Santorini✅Beyonce→Beyonce✅Stefani "Lady Gaga" Germanotta→Stefani Germanotta✅Lebron James, Jr.→Lebron James Jr✅Hailey Bieber (Baldwin-)→Hailey Bieber✅Shania (Irene-) Twain→Shania Twain✅Charles "Chaz" Fluffy Wong, Duke of CatTown→Charles Wong✅
关键逻辑说明
- 昵称移除:用
"[^"]+"精准匹配双引号包裹的内容,直接删除。 - 婚前名移除:匹配括号内的字母+连字符组合,覆盖你提到的
(name-)格式。 - 后缀/头衔区分:先识别Jr/Sr/罗马数字这类合法后缀,调整格式后保留;再删除所有非后缀的贵族头衔及后续冗余内容。
- 名姓提取:拆分清理后的姓名为单词列表,直接取第一个(名)和最后一个(姓),自动兼容单名场景。
内容的提问来源于stack exchange,提问作者user8421
相关产品推荐
相关产品推荐

