使用str.split结合正则表达式拆分首字母大写名与全大写姓氏
解决方案
你之前用split的思路不适用全大写姓氏位置不固定的场景,改为先提取所有全大写片段作为姓氏,剩余内容处理后作为名字即可实现需求,代码如下:
# 提取所有全大写单词拼接为姓氏 df['LastName'] = df['FullName'].str.findall(r'\b[A-Z]+\b').str.join(' ') # 移除所有全大写单词,清理多余空格后作为名字 df['FirstName'] = df['FullName'].str.replace(r'\b[A-Z]+\b', '', regex=True)\ .str.strip()\ .str.replace(r'\s+', ' ', regex=True)
规则适配调整
如果你的姓名数据中存在单大写字母前缀(比如A John里的A是名字前缀而非姓氏),可以把正则里的全大写单词匹配规则改为仅匹配长度≥2的全大写串,避免误判:
把r'\b[A-Z]+\b'替换为r'\b[A-Z]{2,}\b'即可。
效果验证
用你给出的示例测试,输出结果如下:
| FullName | FirstName | LastName |
|---|---|---|
| Manuel JOSE | Manuel | JOSE |
| Vincent MUANDUMBA | Vincent | MUANDUMBA |
| Alejandro DE LORRES | Alejandro | DE LORRES |
| Luis FILIPE da Rivera | Luis da Rivera | FILIPE |
| LIM Jock Hoi | Jock Hoi | LIM |
内容的提问来源于stack exchange,提问作者LennyAngola
相关产品推荐
相关产品推荐

