2011-10-23 23 views
1

我正在学习正则表达式,我想检查python正在使用的机制。Python 2.6正则表达式机制?

我的正则表达式:

s = re.findall(ur"\d+\.?\d+", "123,45.567 78"). 

首先,我认为结果将是只有45.567

当我运行它,我得到了所有的数字,包括小数点([“123” ,“45.567”,“78”]),但是使用的过程并不十分清楚。

这是我的理解: Python的第一次启动时用表达式\ d +,将发现123是确定的(贪婪搜索尽可能逗号之前)。接下来,它期望一个可选的点(。?)不在那里,并且没关系。接下来,它需要一个或多个数字。但下一个字符是一个不被接受的逗号(,)。 Python将回到12(下降3)。 12满满第一个\ d +。接下来,它期望一个不存在的可选点,接下来它需要一个或多个数字,3个与其匹配。也就是说,123个fullfils是整个正则表达式。

Python会记住123的偏移量2,并在123之后重新开始。也就是说,Python会开始在字符串45.567,78处使用整个正则表达式。

也就是说,整个正则表达式用于三倍。第一次发现123 找到45.567和第三次它会找到78

+1

请多关注问题的格式。大块文字难以阅读。并使用代码格式。 – Mat

+0

运行's = re.findall(ur“\ d + \。?\ d +”,“123,45.567 78”,re.DEBUG)应该可以帮助您了解Python的行为。 – robert

+0

您对第一个“123”匹配的描述是正确的。匹配后,正则表达式引擎会尝试匹配紧接在第一个匹配之后的位置(逗号前的位置),并且这会失败。但是引擎不会放弃 - 它会在字符串中的下一个字符上“碰撞”_并且能够匹配“45.567”。然后在空间之前再次失败并碰撞,然后找到第三个匹配。正则表达式引擎会在字符串中的每个位置检查匹配,即使在字符串中最后一个字符后面的位置也会碰撞。 – ridgerunner

回答

4

\d+\.?\d+永远也匹配\d+\d+因为.是可选的(也许你现在明白为什么它匹配所有)的第二次。所以它可以像约束条件那样回溯。

1

documentation of findall(重点煤矿):

返回所有非重叠的字符串模式比赛,作为一个字符串列表。

在我看来,这将描述你所看到的行为。要获得不重叠的比赛,您必须在上一场比赛结束后开始下一场比赛。