Python中re.findall()正则过度匹配问题:提取sum_it函数失败
解决正则表达式过度匹配问题,精准提取sum_it函数
嘿,我明白你遇到的麻烦了——用正则提取目标函数时不小心把前面的无关内容也带进来了,这确实挺闹心的。咱们一步步来搞定它:
你的原始场景
你用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函数,但用这段代码得到了过度匹配的结果:
import re print(re.findall(r"\s+[\w._]+ = function\(.+?\)\s*{.+?\n}\s", s, flags=re.DOTALL)[0])
问题出在哪?
- 匹配范围太宽泛:开头的
\s+[\w._]+会匹配字符串里第一个符合规则的函数名(也就是前面的f),而不是你目标的sum_it。 - 无效的换行匹配:正则里的
\n在你的字符串中根本不存在(整个内容是一行),这会导致非贪婪匹配失效,最终从第一个function(...)开始一直匹配到最后的},把前面的f函数也一并包含进来。
修正后的解决方案
咱们直接精准锁定sum_it函数,同时调整正则规则适配你的字符串结构:
import re 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函数的正则 target_func = re.findall(r"sum_it = function\(.+?\)\s*{.*?}", s, flags=re.DOTALL)[0] print(target_func)
输出结果
sum_it = function(xdat) { ans = apply(xdat, 2, sum) return(ans) }
这样就完美提取到你想要的sum_it函数啦!如果之后需要匹配其他带{}的函数,只需要把sum_it替换成对应的函数名就行~
内容的提问来源于stack exchange,提问作者wen
相关产品推荐
相关产品推荐

