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

时间:2017-01-23 17:15:20

标签: 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)", text)
print m

我做错了什么?

2 个答案:

答案 0 :(得分:4)

使用非捕获组:

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

请参阅regex demo

或者,使用替代模式:

re.findall

请参阅another demo

两者都可以与re.findall一起使用您的示例。第一个没有捕获组,因此re.findall将输出匹配值,第二个将仅输出捕获的值(组1内容),因为如果在模式内定义了捕获组,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')) 将返回捕获组内容

Python demo

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

输出:

pasteboard.string = "*199*\(phoneNumber)#"

答案 1 :(得分:1)

使用括号创建对象组。在这里,我选择了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'