如何用正则表达式从DataFrame列提取末尾逗号后的无数字姓名
从DataFrame字符串列提取纯姓名的正则解决方案
问题场景
给定如下结构的DataFrame A:
| 编号(id) | 信息(information) |
|---|---|
| 001 | Yellow, in town, John |
| 002 | Green, home, Lia 33 |
| 003 | Yellow, garden, Peter2543 |
| 004 | Red, 23 garden, 004 John891 |
| 005 | Red, home, 245Sarah |
| 006 | Red 2, park 28, 67 Luke |
| 007 | Purple 03, to the beach, Mary Rose 9855 |
| ... | ... |
需要新增名为name的列,从information列中提取不含数字的姓名,预期结果如下:
| 编号(id) | 信息(information) | 姓名(name) |
|---|---|---|
| 001 | Yellow, in town, John | John |
| 002 | Green, wardrobe, home, Lia 33 | Lia |
| 003 | Yellow, garden, Peter2543 | Peter |
| 004 | Red, 23 garden, 004 John891 | John |
| 005 | Red, hat, home, 245Sarah | Sarah |
| 006 | Red 2, park 28, 67 Luke | Luke |
| 007 | Purple 03, to the beach, Mary Rose 9855 | Mary Rose |
| ... | ... | ... |
提取规则
information列中的姓名始终位于最后一个逗号之后- 姓名前后可能带有数字,数字与姓名之间可能有空格或无空格
- 姓名可能是两个单词(如Mary Rose)
当前使用的代码只能提取最后一个逗号后的全部内容(如Lia 33、Peter2543),无法过滤掉数字,需要结合正则表达式实现精准提取。
解决方案
核心思路
- 先通过
rsplit(',', 1)提取最后一个逗号后的内容 - 用正则表达式从该内容中匹配由纯字母和空格组成的姓名序列(支持单/双词姓名)
代码实现
import re import pandas as pd # 假设A是已有的DataFrame def get_pure_name(info_str): # 提取最后逗号后的部分,去除首尾空格 target_part = info_str.rsplit(',', 1)[1].strip() if ',' in info_str else info_str.strip() # 匹配纯字母+空格的姓名(支持多词) name_match = re.search(r'[A-Za-z]+(?:\s[A-Za-z]+)*', target_part) return name_match.group(0) if name_match else '' # 新增name列 A['name'] = A['information'].apply(get_pure_name)
正则表达式说明
[A-Za-z]+(?:\s[A-Za-z]+)*
[A-Za-z]+:匹配至少一个英文字母,对应姓名的第一个单词(?:\s[A-Za-z]+)*:非捕获组,匹配零个或多个「空格+字母单词」的组合,用来支持双词姓名(比如Mary Rose)- 整个表达式会自动跳过目标内容前后的数字和空格,精准提取纯姓名部分
效果验证
该代码可完美处理所有测试案例:
- "Lia 33" → 提取"Lia"
- "Peter2543" → 提取"Peter"
- "004 John891" → 提取"John"
- "245Sarah" → 提取"Sarah"
- "Mary Rose 9855" → 提取"Mary Rose"
内容的提问来源于stack exchange,提问作者LRD
相关产品推荐
相关产品推荐

