在 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])
讨论后更新:
乍一看,非贪婪限定符似乎会寻找字符最少的匹配子串。不过,它真正起作用的方式是寻找 第一个 可以匹配的子字符串,然后匹配其中尽可能少的字符。
我正在使用 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])
讨论后更新:
乍一看,非贪婪限定符似乎会寻找字符最少的匹配子串。不过,它真正起作用的方式是寻找 第一个 可以匹配的子字符串,然后匹配其中尽可能少的字符。