我正在使用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)
}
答案 0 :(得分:1)
括号中的通配符匹配。因为您正在使用"。"要匹配参数列表,它还可以匹配括号字符。第一场比赛包括第一场比赛和最后一场比赛之间的所有比赛。如果你将这一行更改为它,它应该可以工作(虽然你在开始时获得了很多额外的空间,并且有更好的方法来进行这种匹配):
print(re.findall(r"\s+[\w._]+ = function\([^)]*\)\s*{.+?\n}\s", s, flags=re.DOTALL)[0])
讨论后更新:
乍一看,似乎非贪婪的限定符会查找匹配的字符串最少的子字符串。但它真正起作用的方式是,它寻找可以匹配的第一个子字符串,然后在其中匹配尽可能少的字符。