为何Pandas的str.extract()与re.findall()表现不同?报错无捕获组
Pandas str.extract与re.findall正则匹配差异原因解析
问题场景
你尝试对如下索引数据使用df.<column_name or index>.str.extract(r'\d+'):
28 USD-ABC-S__7y 29 USD-ABC-S__8y Name: InstrumentIdentifier, dtype: object
触发了如下ValueError:
ValueError: pattern contains no capture groups
但使用Python标准库的re.findall()却能得到预期结果:
import re re.findall(r'\d+', 'USD-ABC-S__8y') # 返回: ['8']
核心差异原因
- Pandas
str.extract()的设计逻辑:这个方法专门用于从字符串中提取捕获组的内容,返回对应分组的DataFrame/Series。它要求正则表达式必须包含至少一个用()包裹的捕获组,否则会直接抛出ValueError——因为它无法确定要提取哪部分内容。 - Python
re.findall()的设计逻辑:这个方法逻辑更灵活:- 若正则无捕获组,返回所有匹配整个正则表达式的字符串列表;
- 若有捕获组,才返回捕获到的内容列表。所以无捕获组的
r'\d+'能正常工作。
解决方法
给正则表达式加上捕获组即可:
# 使用带捕获组的正则 df['InstrumentIdentifier'].str.extract(r'(\d+)')
执行后会得到如下结果:
0 28 7 29 8
如果想直接得到Series格式的结果,可以加上squeeze()方法:
df['InstrumentIdentifier'].str.extract(r'(\d+)').squeeze()
内容的提问来源于stack exchange,提问作者keynesiancross
相关产品推荐
相关产品推荐

