如何用正则从Pandas DataFrame中提取姓名对应地点子串
提取姓名后"of"开头至第二个逗号的地点信息
假设你的任命通知文本格式类似 APPOINTMENT OF DAVID MERRIGAN, of NEW YORK, NY, to the position...,结合你已经能提取大写姓名的情况,用下面的正则配合Pandas就能搞定目标地点提取:
核心正则表达式
针对姓名后带逗号+of的场景:
(?<=[A-Z]+(?:\s[A-Z]+)+, of ).*?(?=,.*?,)
如果你的文本里姓名和of之间没有逗号(比如DAVID MERRIGAN of NEW YORK, NY, ...),就用这个版本:
(?<=[A-Z]+(?:\s[A-Z]+)+ of ).*?(?=,.*?,)
Pandas 代码示例
假设你的DataFrame存储通知文本的列叫notice_text,直接用str.extract提取:
import pandas as pd # 模拟你的数据 df = pd.DataFrame({ 'notice_text': [ "APPOINTMENT OF DAVID MERRIGAN, of NEW YORK, NY, to the Board of Directors", "NAMING OF SARAH JANE SMITH, of LOS ANGELES, CA, as Senior Executive" ] }) # 提取地点列 df['location'] = df['notice_text'].str.extract(r'(?<=[A-Z]+(?:\s[A-Z]+)+, of ).*?(?=,.*?,)') # 查看结果 print(df[['notice_text', 'location']])
正则逻辑拆解
(?<=[A-Z]+(?:\s[A-Z]+)+, of ):正向后顾断言,确保我们从「大写姓名(支持多部分,比如带中间名)+ ", of "」之后开始匹配,避免抓错位置.*?:非贪婪匹配,只取到目标结束位置的内容,不会把后面的文本也拉进来(?=,.*?,):正向前瞻断言,匹配到「第二个逗号」就停止,刚好截取到我们要的地点范围
为什么之前返回-1?
返回-1一般是正则完全没匹配到内容,检查这几点:
- 文本里是否真的有「of开头+后面至少两个逗号」的结构?
- 姓名和of之间的分隔符是不是和正则里的不一致?(比如你文本里是空格,正则写了逗号)
- 是不是用了贪婪匹配(比如把
.*?写成.*),导致匹配范围跑过头?
内容的提问来源于stack exchange,提问作者xrichervis
相关产品推荐
相关产品推荐

