Python正则表达式匹配时如何排除脚注导致的误匹配
解决Python正则提取股票代码时排除脚注误匹配的问题
核心方案:用负向零宽断言过滤脚注项
给原正则添加负向零宽后行断言,确保匹配的括号内容前不会出现带空格变化的FS:脚注标识,精准排除误匹配的脚注内容。
修改后的正则表达式
r"(?<!FS:\s*)\(([A-Z]+\.?[A-Z]*)\)"
正则各部分解释
(?<!FS:\s*):负向零宽后行断言,检查当前位置(左括号(的位置)之前是否存在FS:加任意数量空白字符(空格、制表符、换行等),若存在则跳过该匹配项。\(:匹配左括号。([A-Z]+\.?[A-Z]*):捕获股票代码,支持纯大写字母(如META)和带点的格式(如BRK.B)。将原正则的非贪婪*?改为贪婪*,确保完整匹配代码。\):匹配右括号。
Python代码示例
import re # 测试文本,包含正常股票代码和脚注误匹配项 sample_text = """ 持仓标的:(META)、(MSFT)、(BRK.B) 文档脚注:FS: (BM) 数据来源说明,FS: (XYZ) 统计口径备注 """ # 应用修改后的正则 stock_pattern = r"(?<!FS:\s*)\(([A-Z]+\.?[A-Z]*)\)" matched_stocks = re.findall(stock_pattern, sample_text) print(matched_stocks) # 输出结果:['META', 'MSFT', 'BRK.B']
额外说明
如果脚注的FS:与括号之间必须至少有一个空格,可将断言部分改为(?<!FS:\s+);若需兼容小写的fs:,可添加re.IGNORECASE标志,或修改断言为(?<!(FS|fs):\s*)。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

