求助:使用Pandas str.extract提取双正则模式失败问题
解决正则提取GS/WG编号的问题
原代码的核心问题
你的代码存在两个关键问题:
- 正则表达式
(GS-\d+)(|)(WG-\d+)强制要求GS-\d+必须紧跟WG-\d+(中间只能是空字符),如果字符串里两者不连续、顺序颠倒,就匹配不到WG-\d+。 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
相关产品推荐
相关产品推荐

