You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python正则组合[]与?匹配股票数据未获预期结果问题排查

正则匹配失效原因

原正则和代码存在3个核心问题:

  • 未开启多行匹配模式:默认正则规则下,$ 仅匹配整个读取文本的最末尾位置,不会识别每行的行尾,导致除了最后一行外其余所有行都不会被匹配校验。
  • 未兼容行尾冗余空白:原始数据中部分行的市盈率字段后存在多余空格,直接用$匹配行尾时,这些空格会导致匹配中断。
  • 字段匹配逻辑容错性不足:平均成交量的匹配规则[2468][0-9]?\.[0-9]+M仅支持整数部分为1-2位的数值,不符合“数值以偶数开头”的判断要求(仅需整数第一位为偶数,后续位数无限制);市盈率的小数位匹配也仅支持最多2位小数,适配性差。
修正后的可运行方案

修改点如下:

  1. 编译正则时添加re.M多行模式标志,让^和$可以匹配每一行的开头和结尾
  2. 调整平均成交量匹配规则为[2468][0-9]*\.[0-9]+M,只要整数部分首位是偶数即可匹配,支持任意长度整数位
  3. 调整市盈率匹配规则为[0-9]+\.[0-9]*[13579],支持任意长度小数位,仅校验最后一位为奇数
  4. 市盈率匹配段后添加\s*,兼容行尾可能存在的多余空白
  5. 正则开头添加^锚定行首,避免匹配错位

完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:27:38