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

正则表达式:如何匹配捕获字符前的字符且排除开头等号?

解决pip freeze版本号匹配的正则问题

嘿,我来帮你搞定这个正则匹配的问题!你之前的思路方向有点搞反了,用了负前瞻但其实应该用负向后瞻来实现需求,咱们一步步来:

问题复盘

你需要从pip freeze的输出片段(比如ply==3.10 powerline-status===2.6.dev9999-git.b-e52754d5c5c6a82238b43a5687a5c4c647c9ebc1- psutil==4.0.0 ptyprocess==0.5.1)里,精准捕获==3.10、==4.0.0、==0.5.1这类内容,核心要求是:

  • 匹配的==前面不能是等号(避免匹配===里的后两个等号)
  • 只捕获==加版本号的部分

为什么之前的正则失败?

你用的(?![^=])==[0-9]+.*里,(?![^=])是负前瞻,它的意思是「当前位置后面不能是非等号字符」,也就是强制后面必须是等号,这完全和你的需求相反了,自然匹配不到正确结果。

正确的正则方案

我们需要用负向后瞻(?<!=)来断言「==的前一个字符不是等号」,这样就能排除多等号的情况,再搭配版本号的匹配规则:

1. 针对简单版本号(如x.x或x.x.x)

(?<!=)==\d+\.\d+(?:\.\d+)?

这个正则的拆解:

  • (?<!=):负向后瞻,确保当前位置的前一个字符不是等号
  • ==:匹配两个连续的等号
  • \d+\.\d+(?:\.\d+)?:匹配类似3.10、4.0.0的版本号,(?:...)是非捕获组,用来可选第三个数字段

2. 兼容复杂版本号(如带.dev、git哈希的)

如果要匹配更复杂的版本格式(比如2.6.dev9999-git.b-e52754d...),可以用更宽松的规则:

(?<!=)==[\d.]+(?:[-.\w]+)?
  • [\d.]+:匹配数字和点组成的基础版本部分
  • (?:[-.\w]+)?:可选匹配带连字符、点、字母数字的后缀内容

测试效果

把上面的正则用到你的输入字符串上,会精准捕获到:

  • ==3.10
  • ==4.0.0
  • ==0.5.1
    完全符合你的需求,不会匹配到powerline-status后面的===部分。

内容的提问来源于stack exchange,提问作者Vivek Gani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:13:03