使用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
我做错了什么?
答案 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'))
将返回捕获组内容
['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'