使用regex-python捕获版本号

使用regex-python捕获版本号,python,regex,Python,Regex,使用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)",

使用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)

或者,使用另一种模式:

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

这两种方法都适用于您的示例。第一个没有捕获组,因此
re.findall
将输出匹配值,第二个将只输出捕获值(组1内容),因为
re.findall
返回捕获组内容(如果捕获组在模式中定义)

:

输出:

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

使用非捕获组:

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

或者,使用另一种模式:

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

这两种方法都适用于您的示例。第一个没有捕获组,因此
re.findall
将输出匹配值,第二个将只输出捕获值(组1内容),因为
re.findall
返回捕获组内容(如果捕获组在模式中定义)

:

输出:

['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"(?P<version>(\d+\.)+\d*(?!tgz))", text).group('version')
...: print m
'0.0.9'
text='/primerjs-0.0.9.tgz'
…:m=re.search(r“(?P(\d++\)++\d*(?!tgz))”,text.group('version'))
…:打印m
'0.0.9'

使用括号创建对象组。在这里,我选择了
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"(?P<version>(\d+\.)+\d*(?!tgz))", text).group('version')
...: print m
'0.0.9'
text='/primerjs-0.0.9.tgz'
…:m=re.search(r“(?P(\d++\)++\d*(?!tgz))”,text.group('version'))
…:打印m
'0.0.9'