Python正则组合[]与?匹配股票数据未获预期结果问题排查
正则匹配失效原因
原正则和代码存在3个核心问题:
- 未开启多行匹配模式:默认正则规则下,
$仅匹配整个读取文本的最末尾位置,不会识别每行的行尾,导致除了最后一行外其余所有行都不会被匹配校验。 - 未兼容行尾冗余空白:原始数据中部分行的市盈率字段后存在多余空格,直接用
$匹配行尾时,这些空格会导致匹配中断。 - 字段匹配逻辑容错性不足:平均成交量的匹配规则
[2468][0-9]?\.[0-9]+M仅支持整数部分为1-2位的数值,不符合“数值以偶数开头”的判断要求(仅需整数第一位为偶数,后续位数无限制);市盈率的小数位匹配也仅支持最多2位小数,适配性差。
修正后的可运行方案
修改点如下:
- 编译正则时添加
re.M多行模式标志,让^和$可以匹配每一行的开头和结尾 - 调整平均成交量匹配规则为
[2468][0-9]*\.[0-9]+M,只要整数部分首位是偶数即可匹配,支持任意长度整数位 - 调整市盈率匹配规则为
[0-9]+\.[0-9]*[13579],支持任意长度小数位,仅校验最后一位为奇数 - 市盈率匹配段后添加
\s*,兼容行尾可能存在的多余空白 - 正则开头添加
^锚定行首,避免匹配错位
完整代码:
import re with open("stocks.txt", "r") as f: content = f.read() pattern = re.compile(r"^(.+?)\s+[2468][0-9]*\.[0-9]+M\s+[0-9]+\.[0-9]+B\s+[0-9]+\.[0-9]*[13579]\s*$", re.M) result = [name.strip() for name in pattern.findall(content) if name.strip() != "Name"] print(result)
运行代码后将输出预期结果:
['Alphabet C', 'Boeing', 'Facebook', 'Goldman Sachs', 'Home Depot', 'JPMorgan', 'Tesla']
内容的提问来源于stack exchange,提问作者Rohit Verma
相关产品推荐
相关产品推荐

