使用regex-python捕获版本号

2024-04-16 21:40:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

我已经在一个在线regex测试仪上测试了它,它似乎抓住了我想要的东西。但是,以下代码只打印['0.']

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

我做错什么了?你知道吗


Tags: 字符串代码textrerestapi形式regex
2条回答

使用非捕获组:

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

参见regex demo

或者,使用另一种模式:

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

another demo

两者都能很好地与^{}一起使用。第一个没有捕获组,因此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']

使用圆括号创建对象组。在这里,我选择了0组,这意味着给我整个匹配

代码:

text = '/primerjs-0.0.9.tgz'
...: m = [x.group(0) for x in re.finditer(r"(\d+\.)+\d*(?!tgz)", text)]
...: print m[0]
'0.0.9'

更好的方法是使用搜索而不是re.findall()

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

为了清晰起见,您甚至可以添加命名组:

text = '/primerjs-0.0.9.tgz'
...: m = re.search(r"(?P<version>(\d+\.)+\d*(?!tgz))", text).group('version')
...: print m
'0.0.9'

相关问题 更多 >