Skip to main content
 首页 » 编程设计

python之使用正则表达式 python 捕获版本号

2025年05月04日31powertoolsteam

使用 rest api 我得到以下形式的字符串:

/primerjs-0.0.3-3.tgz 
/primerjs-0.0.3.tgz 
/0.0.3-16 

我只想从上面的字符串中获取 0.0.3 部分。我想出了以下正则表达式:

(\d+\.)+\d*(?!tgz) 

我已经在在线正则表达式测试仪上对其进行了测试,它似乎捕获了我想要的东西。但是下面的代码只打印 ['0.']

text = '/primerjs-0.0.9.tgz' 
m = re.findall(r"(\d+\.)+\d*(?!tgz)", text) 
print m 

我做错了什么?

请您参考如下方法:

使用非捕获组:

(?:\d+\.)+\d*(?!tgz) 

参见 regex demo

或者,使用替代模式:

[/-](\d+\.\d+\.\d+) 

参见 another demo

两者都适用于 re.findall用你的例子。第一个没有捕获组,因此 re.findall 将输出匹配值,第二个将仅输出捕获的值(第 1 组内容),因为 re.findall 返回捕获如果在模式内定义了捕获组,则对内容进行分组。

Python demo :

import re 
rx = r'[/-](\d+\.\d+\.\d+)' 
print(re.findall(rx, '/primerjs-0.0.3-3.tgz   /primerjs-0.0.3.tgz   /0.0.3-16')) 
rx = r'(?:\d+\.)+\d*(?!tgz)' 
print(re.findall(rx, '/primerjs-0.0.3-3.tgz   /primerjs-0.0.3.tgz   /0.0.3-16')) 

输出:

['0.0.3', '0.0.3', '0.0.3'] 
['0.0.3', '0.0.3', '0.0.3']