如何修正从Ticker字段提取Symbol与Expiry的正则逻辑错误
问题解决
根因分析
- 正则捕获组使用错误:你用括号定义了提取分组,但调用
re.search().group()时未指定分组编号,默认返回整个匹配的字符串,而非括号内的目标内容:Expiry_Pattern匹配结果会带上前缀横杠,比如返回-III而非IIISymbol_Pattern匹配结果会带上后缀的横杠和到期标识,比如返回ZEEL-III而非ZEEL
- 手动循环遍历DataFrame的写法效率极低,不适合处理大数据量场景。
修正方案
方案1:仅调整现有代码的逻辑
修改正则的取值逻辑即可:
Expiry_Pattern = r'-([A-Z]{1,3})' Symbol_Pattern = r'(.*?)-[A-Z]{1,3}' for row in range(0, len(df)): ticker_val = df.iat[row, index_Ticker] # 指定取第一个捕获组的内容,而非全匹配结果 Expiry = re.search(Expiry_Pattern, ticker_val).group(1) df.iat[row, index_Expiry] = Expiry Symbol = re.search(Symbol_Pattern, ticker_val).group(1) df.iat[row, index_Symbol] = Symbol
方案2:更高效的pandas原生写法(推荐)
直接用str.extract批量提取,不需要写循环,代码更简洁、性能更高:
# 一次正则匹配同时提取两个字段 df[['Symbol', 'Expiry']] = df['Ticker'].str.extract(r'^(.*?)-([A-Z]{1,3})')
正则含义说明:
^匹配字符串开头(.*?)第一个捕获组,非贪婪匹配横杠前的所有内容,对应Symbol-匹配横杠分隔符([A-Z]{1,3})第二个捕获组,匹配1-3位大写字母,对应Expiry
内容的提问来源于stack exchange,提问作者Krishna Gupta
相关产品推荐
相关产品推荐

