理解python正则表达式

时间:2014-12-29 08:42:53

标签: python regex

我们假设我有以下字符串:

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 ...

我知道这是一个贪婪的搜索,但是为什么要抓住两个组呢?

1 个答案:

答案 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']