在 Python 中与正则表达式函数 re.findall() 过度匹配

Over-matching with regular expression function re.findall() in Python

我正在使用 Python 2 并且我有一个字符串如下。

s = """
f = function(x) sum(is.na(x))

apply(xdat, 2, f)

sum_it = function(xdat) {
    ans = apply(xdat, 2, sum)
    return(ans)
}
"""

我打算提取{}中的sum_it函数。我使用了下面的代码

print(re.findall(r"\s+[\w._]+ = function\(.+?\)\s*{.+?\n}\s", s, flags=re.DOTALL)[0])

这给了我错误的结果:

f = function(x) sum(is.na(x))

apply(xdat, 2, f)

sumit = function(xdat) {
    ans = apply(xdat, 2, sum)
    return(ans)
}

我明确表示我想要的子字符串应该包含{}。但为什么这个正则表达式无法排除字符串的开头部分,其中明显没有 {} ?我怎样才能得到这个:

sumit = function(xdat) {
    ans = apply(xdat, 2, sum)
    return(ans)
}

是括号中的通配符匹配。由于您使用的是“。”为了匹配参数列表,它还可以匹配括号字符。第一个匹配项包括第一个开括号和最后一个闭括号之间的所有内容。如果你把这行改成这样,它应该可以工作(虽然你在开始时得到了很多额外的 space,并且有更好的方法来做这个匹配):

print(re.findall(r"\s+[\w._]+ = function\([^)]*\)\s*{.+?\n}\s", s, flags=re.DOTALL)[0])

讨论后更新:

乍一看,非贪婪限定符似乎会寻找字符最少的匹配子串。不过,它真正起作用的方式是寻找 第一个 可以匹配的子字符串,然后匹配其中尽可能少的字符。