Pandas extractall使用带或条件的正则捕获组报错解决方法
Pandas字符串列提取固定前缀编码的正则报错修复
需求说明
需要从DataFrame的字符串类型列中提取目标编码,这类编码固定带有PT、SA两种2字符前缀,合法编码示例如下:
PT00034 SA00043 SA44 PT554
问题复现
最初使用正则(PT|SA)[0-9]{5}在测试工具中可匹配前2个带5位数字后缀的编码,但传入extractall执行以下代码时触发报错:
df['Pat Capture'] = df['TextString'].str.extractall(r"((PT|SA)[0-9]{5})").groupby(level=0).agg(lambda x: ", ".join(x.unique()))
报错信息:
ValueError: Wrong number of items passed 2, placement implies 1
已知报错原因是extractall识别到正则中存在2个待提取的捕获分组,返回结果列数和赋值的单列不匹配,同时原正则仅能匹配固定5位数字后缀,无法兼容短数字、零填充的不同长度编码。
解决方案
正则改写规则
- 前缀的或逻辑分组改为非捕获分组:在分组括号内开头加
?:,即把(PT|SA)改为(?:PT|SA),该分组仅做匹配逻辑判断,不会被识别为单独的提取列 - 数字后缀匹配规则改为匹配1位及以上数字:把固定匹配5位的
[0-9]{5}改为[0-9]+,兼容2位、3位、5位零填充等不同长度的数字后缀
修正后代码
df['Pat Capture'] = df['TextString'].str.extractall(r"((?:PT|SA)[0-9]+)").groupby(level=0).agg(lambda x: ", ".join(x.unique()))
效果说明
修正后的正则仅返回1列完整编码的匹配结果,不会触发列数不匹配报错,同时可以匹配所有符合前缀+数字格式的编码,包括示例中的SA44、PT554短编码和PT00034、SA00043这类零填充长编码。
内容的提问来源于stack exchange,提问作者EA Bubnoff
相关产品推荐
相关产品推荐

