正则表达式:如何匹配捕获字符前的字符且排除开头等号?
解决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
相关产品推荐
相关产品推荐

