Python 2.6正则表达式机制?
我正在学习正则表达式,我想检查python使用的机制 我有正则表达式:Python 2.6正则表达式机制?,python,regex,Python,Regex,我正在学习正则表达式,我想检查python使用的机制 我有正则表达式: s = re.findall(ur"\d+\.?\d+", "123,45.567 78"). 首先我认为结果只有45.567 当我运行它时,我得到了所有的数字,包括小数([“123”,“45.567”,“78”),但它不太清楚所使用的过程 以下是我的理解: Python首先以表达式\d+开始,该表达式将找到123,这是确定的(在逗号之前尽可能多地进行贪婪搜索)。下一步,它需要一个可选的点(.?),它不在那里,并且是ok的
s = re.findall(ur"\d+\.?\d+", "123,45.567 78").
首先我认为结果只有45.567
当我运行它时,我得到了所有的数字,包括小数([“123”,“45.567”,“78”),但它不太清楚所使用的过程
以下是我的理解:
Python首先以表达式\d+开始,该表达式将找到123,这是确定的(在逗号之前尽可能多地进行贪婪搜索)。下一步,它需要一个可选的点(.?),它不在那里,并且是ok的。接下来,它需要一个或多个数字。但是下一个字符是一个不被接受的逗号(,)。Python将返回到12(下降3)。12 fullfils第一个\d+。下一步,它需要一个可选的点不在那里,下一步,它需要一个或多个数字,3匹配它。也就是说,123 fullfil是整个正则表达式
Python将记住123的偏移量2,并在123之后重新开始。也就是说,Python将在字符串45.567,78处开始使用整个正则表达式
也就是说,整个正则表达式被使用了三次。第一次发现123。
第二次它会找到45.567,第三次它会找到78。
\d+\.?\d+
也将始终匹配\d+\d+
,因为
是可选的(也许您现在看到了为什么它匹配所有的代码)。因此,它可以在约束允许的范围内尽可能多地回溯。\d+\?\d+
也将始终匹配\d+\d+
,因为
是可选的(也许您现在可以看到为什么它匹配所有项)。因此,它可以在约束允许的范围内进行回溯。来自(强调矿):
以字符串列表的形式返回字符串中模式的所有非重叠匹配项
在我看来,这可以描述你所看到的行为。要获得不重叠的匹配,您必须在上一个匹配结束后开始下一个匹配。从(我的重点):
以字符串列表的形式返回字符串中模式的所有非重叠匹配项
在我看来,这可以描述你所看到的行为。要获得不重叠的匹配,您必须在上一个匹配结束后开始下一个匹配。请注意问题的格式。大块的文字很难阅读。并使用代码格式。运行
s=re.findall(ur“\d+\.?\d+”,“123,45.567 78”,re.DEBUG)
应该可以帮助您了解Python的行为。您对第一个123
如何匹配的描述是正确的。匹配后,正则表达式引擎尝试在第一次匹配后的位置(逗号前的位置)进行匹配,但失败。但是引擎并没有放弃——它“前进”到字符串中的下一个字符,并且能够匹配45.567
。然后它失败了,在空格前再次颠簸,然后找到第三个匹配项。正则表达式引擎将在字符串中的每个位置检查匹配项,即使在字符串中最后一个字符后面的位置也是如此。请注意问题的格式。大块的文字很难阅读。并使用代码格式。运行s=re.findall(ur“\d+\.?\d+”,“123,45.567 78”,re.DEBUG)
应该可以帮助您了解Python的行为。您对第一个123
如何匹配的描述是正确的。匹配后,正则表达式引擎尝试在第一次匹配后的位置(逗号前的位置)进行匹配,但失败。但是引擎并没有放弃——它“前进”到字符串中的下一个字符,并且能够匹配45.567
。然后它失败了,在空格前再次颠簸,然后找到第三个匹配项。正则表达式引擎将在字符串中的每个位置检查匹配,即使在字符串中最后一个字符后面的位置也是如此。