与Python

时间:2018-04-22 03:58:35

标签: python regex findall

我正在使用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)
}

1 个答案:

答案 0 :(得分:1)

括号中的通配符匹配。因为您正在使用"。"要匹配参数列表,它还可以匹配括号字符。第一场比赛包括第一场比赛和最后一场比赛之间的所有比赛。如果你将这一行更改为它,它应该可以工作(虽然你在开始时获得了很多额外的空间,并且有更好的方法来进行这种匹配):

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

讨论后更新:

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