我正在学习正则表达式,我想检查python正在使用的机制。
我有正则表达式:
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填满整个正则表达式。
Python会记住123的偏移2并在123之后重新开始。也就是说,Python会开始在字符串45.567,78处使用整个正则表达式。
也就是说,使用整个正则表达式。第一次找到123。 第二次找到45.567,第三次找到78。
答案 0 :(得分:4)
\d+\.?\d+
始终也会匹配\d+\d+
,因为.
是可选的(也许您现在可以看到它与所有匹配的原因)。所以它可以在约束允许的范围内回溯。
答案 1 :(得分:1)
来自documentation of findall(强调我的):
返回字符串中所有非重叠匹配的字符串,作为字符串列表。
在我看来,这会描述你所看到的行为。要获得非重叠匹配,您必须在上一个匹配结束后开始下一个匹配。