使用regex-python捕获版本号
使用rest api,我得到了以下形式的字符串:使用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)",
/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'