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

如何用正则表达式从DataFrame列提取末尾逗号后的无数字姓名

从DataFrame字符串列提取纯姓名的正则解决方案

问题场景

给定如下结构的DataFrame A:

编号(id)信息(information)
001Yellow, in town, John
002Green, home, Lia 33
003Yellow, garden, Peter2543
004Red, 23 garden, 004 John891
005Red, home, 245Sarah
006Red 2, park 28, 67 Luke
007Purple 03, to the beach, Mary Rose 9855
......

需要新增名为name的列,从information列中提取不含数字的姓名,预期结果如下:

编号(id)信息(information)姓名(name)
001Yellow, in town, JohnJohn
002Green, wardrobe, home, Lia 33Lia
003Yellow, garden, Peter2543Peter
004Red, 23 garden, 004 John891John
005Red, hat, home, 245SarahSarah
006Red 2, park 28, 67 LukeLuke
007Purple 03, to the beach, Mary Rose 9855Mary Rose
.........

提取规则

  • information列中的姓名始终位于最后一个逗号之后
  • 姓名前后可能带有数字,数字与姓名之间可能有空格或无空格
  • 姓名可能是两个单词(如Mary Rose)

当前使用的代码只能提取最后一个逗号后的全部内容(如Lia 33、Peter2543),无法过滤掉数字,需要结合正则表达式实现精准提取。

解决方案

核心思路

  1. 先通过rsplit(',', 1)提取最后一个逗号后的内容
  2. 用正则表达式从该内容中匹配由纯字母和空格组成的姓名序列(支持单/双词姓名)

代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:21:28