我正在学习正则表达式,我想检查一下python使用的机制。在
我有正则表达式:
s = re.findall(ur"\d+\.?\d+", "123,45.567 78").
首先我以为结果只有45.567
当我运行它时,我得到了包括小数([“123”,“45.567”,“78”])在内的所有数字,但它并不是很清楚所使用的过程。在
我的理解是: Python首先使用表达式\d+开始,它将找到123,这是可以的(在逗号之前尽可能多地进行贪婪搜索)。接下来它需要一个可选的点(.?)那是不存在的,它是好的。接下来,它需要一个或多个数字。但下一个字符是不接受的逗号(,)。Python将回到12(drop 3)。12完整填充第一个\d+。接下来它期望一个不存在的可选点,下一个它需要一个或多个数字,3个匹配它。完整的123,这就是全部。在
Python将记住123的偏移量2,并在123之后重新开始。也就是说,Python将在字符串45.567,78处开始使用整个regex。在
也就是说,整个正则表达式被多次使用。第一次找到123。 第二次找到45.567,第三次找到78。在
来自documentation of findall(重点矿):
在我看来这可以描述你所看到的行为。要获得不重叠的匹配,必须在上一个匹配结束后开始下一个匹配。在
\d+\.?\d+
将始终与\d+\d+
匹配,因为.
是可选的(也许您现在了解了它为什么匹配所有内容)。所以它可以在限制条件允许的情况下回溯。在相关问题 更多 >
编程相关推荐