使用 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 返回捕获如果在模式内定义了捕获组,则对内容进行分组。
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']
