Python正则表达式不够贪婪,多个组

Python正则表达式不够贪婪,多个组,python,regex,Python,Regex,在尝试用python进行一些regexp匹配时,我遇到了一个奇怪的问题。我想匹配表xxx.yyy上的十进制数,并将它们分成三组进行进一步处理。我运行了如下代码片段 #!/usr/bin/env python3 import re matches = re.search("a=(\d+)(\.?)(\d+?)", "var k = 2;var a; a=46") print(matches.group(1)) Print返回4,而46将是预期结果。为什么会这样?Python文档指出regex

在尝试用python进行一些regexp匹配时,我遇到了一个奇怪的问题。我想匹配表xxx.yyy上的十进制数,并将它们分成三组进行进一步处理。我运行了如下代码片段

#!/usr/bin/env python3

import re

matches = re.search("a=(\d+)(\.?)(\d+?)", "var k = 2;var a; a=46")
print(matches.group(1))
Print返回4,而46将是预期结果。为什么会这样?Python文档指出regexp+和*是贪婪的,但这里的情况似乎并非如此。原因似乎是最后一个数字在最后一组中结束。我需要至少匹配第一组和最后一组。如果我用最后一组来区分十进制数和非十进制数,我可以跳过中间一组

然而,如果匹配的数字是十进制,那么它似乎确实起作用

#!/usr/bin/env python3

import re

matches = re.search("a=(\d+)(\.?)(\d+?)", "var k = 2;var a; a=46.3")
print(matches.group(1))
印刷品46。如果你能帮我解决这个难题,我会很高兴的。谢谢。

应该是

matches = re.search("a=(\d+(?:\.\d+)?)", "var k = 2;var a; a=46")

原因

你的正则表达式是

(\d+)(\.?)(\d+?)
您的
是可选的,这意味着您的
和下一个
\d+?
是相互独立的。这意味着它首先匹配所有数字(即在您的示例中直到
4
)直到下一个
,这是可选的,最后一个组至少需要一位数字才能成功。所以
6
将在最后捕获的组中

这张照片会让你看得更清楚

应该是

matches = re.search("a=(\d+(?:\.\d+)?)", "var k = 2;var a; a=46")

原因

你的正则表达式是

(\d+)(\.?)(\d+?)
您的
是可选的,这意味着您的
和下一个
\d+?
是相互独立的。这意味着它首先匹配所有数字(即在您的示例中直到
4
)直到下一个
,这是可选的,最后一个组至少需要一位数字才能成功。所以
6
将在最后捕获的组中

这张照片会让你看得更清楚


您有两组小数,至少有一位。因此,第1组为
4
,第2组为空,第3组为
6
。如果要匹配
前面的所有数字,必须将第二组和第三组设置为可选:

matches = re.search("a=(\d+)(?:(\.?)(\d+))?", "var k = 2;var a; a=46")

您有两组小数,至少有一位。因此,第1组为
4
,第2组为空,第3组为
6
。如果要匹配
前面的所有数字,必须将第二组和第三组设置为可选:

matches = re.search("a=(\d+)(?:(\.?)(\d+))?", "var k = 2;var a; a=46")

我做了一些评估,我相信这个答案最接近我想要达到的目标。谢谢@Daniel.我做了一些评估,我相信这个答案最接近我想要实现的目标。谢谢@Daniel@Racialz在编写正则表达式之后,您可以使用正则表达式调试器模式(显示在左侧)site@Racialz在编写正则表达式之后,您可以在该站点上使用正则表达式调试器模式(显示在左侧)