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

求助:使用Pandas str.extract提取双正则模式失败问题

解决正则提取GS/WG编号的问题

原代码的核心问题

你的代码存在两个关键问题:

  1. 正则表达式(GS-\d+)(|)(WG-\d+)强制要求GS-\d+必须紧跟WG-\d+(中间只能是空字符),如果字符串里两者不连续、顺序颠倒,就匹配不到WG-\d+。
  2. str.extract会返回对应捕获组的DataFrame,直接赋值给单个列会导致数据结构混乱,无法正确合并结果。

可行解决方案

方案1:提取所有匹配项并合并(推荐)

如果只需要把所有出现的GS-\d+或WG-\d+合并到一列,用str.findall提取所有匹配结果,再拼接成字符串:

jobseries['New Column'] = jobseries['Occupation'].str.findall(r'(GS-\d+|WG-\d+)').str.join(', ')

这个写法不关心两个模式的顺序和位置,只要出现就能提取,结果会用逗号分隔多个匹配项,没有匹配项则为空字符串。

方案2:分别提取后合并(保留各自捕获)

如果需要分别捕获GS和WG编号再合并,可以用支持两种顺序的正则,配合str.extract处理:

# 提取两种顺序的GS和WG,捕获后合并
jobseries['New Column'] = jobseries['Occupation'].str.extract(r'(?:(GS-\d+).*?(WG-\d+)|(WG-\d+).*?(GS-\d+))').fillna('').apply(
    lambda row: ', '.join(filter(None, row)), axis=1
)

这个正则会匹配两种情况:GS在前WG在后,或者WG在前GS在后,filter(None, row)会自动去掉空值,再用逗号拼接。

测试示例

假设Occupation列有以下值:

  • "Senior Analyst (GS-12), WG-03 Support"
  • "WG-05 Technician, GS-10 Specialist"
  • "Only GS-11 Role"

用方案1的代码会得到:

  • "GS-12, WG-03"
  • "WG-05, GS-10"
  • "GS-11"

内容的提问来源于stack exchange,提问作者Jeremiah Anderson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:45:25