You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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])

问题出在哪?

  1. 匹配范围太宽泛:开头的\s+[\w._]+会匹配字符串里第一个符合规则的函数名(也就是前面的f),而不是你目标的sum_it。
  2. 无效的换行匹配:正则里的\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:49:22