我们假设我有以下字符串:
out = "someUndefinedGarbageVALUE: 12 34 23 00possiblySomeOtherGarbage"
现在我要解析“12 34 23 00”值。在这种情况下,我执行以下操作:
regex = re.compile('VALUE: (\d\d\s?)*')
matches = regex.findall(out)
但在这种情况下,我只会得到:
00
当我稍微升级正则表达式时:
regex = re.compile('VALUE: ((\d\d\s?)*)')
我会得到:
12 34 23 00, 00
我的问题:
1)使用http://regexpal.com/我看到第一个表达式很好用。试试自己:
VALUE: (\d\d\s?)*
针对
garbageVALUE: 05 03 04garbage
使用Python它是不同的。我的推理在哪里错了?
2)为什么第二个表达式恰好抓住了两个组?它应该只捕获一个
12 34 23 00
或所有可能的变化?
12, 12\s, 12\s34 ...
我知道这是一个贪婪的搜索,但是为什么要抓住两个组呢?
答案 0 :(得分:6)
差异是由re.findall
引起的。来自文档:
如果模式中存在一个或多个组,则返回组列表
这解释了为什么你得到00
:这就是小组(\d\d\s?)
最后匹配的内容。
和
如果模式有多个组
,这将是一个元组列表
((\d\d\s?)*)
包含两个组,因此findall
会返回('12 34 23 00', '00')
。
您可以改为使用finditer
。
>>> print [match.group() for match in re.finditer('VALUE: (\d\d\s?)*', out)]
['VALUE: 12 34 23 00']