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

使用Python 2的re.findall()无法正确提取sapply/lapply的第二个参数

解决sapply/lapply第二个参数提取问题

首先,咱们来分析你原来正则表达式的问题:你用的\b[sl]apply\(.+,\s*([\w._]+?)[,\s)]里,.+是贪婪匹配,它会从(开始尽可能多地匹配字符,直到遇到最后一个符合条件的逗号为止。比如第一个sapply( by, paste.me, collapse, split),.+会直接匹配到collapse 这个位置,然后捕获后面的split,这就不是你要的第二个参数了。

修正后的正则表达式

我们需要精准定位到第一个参数后的逗号,然后捕获第二个参数。可以用这个正则:

r"\b[sl]apply\(\s*[^,]+?\s*,\s*([\w._]+)\s*[,)]"

正则各部分解释

  • \b[sl]apply\(:匹配sapply(或lapply(,\b确保是完整的函数名,避免误匹配类似xsapply的字符串
  • \s*:匹配第一个参数前后的任意空格(兼容代码里的格式差异)
  • [^,]+?:非贪婪匹配第一个参数的内容,[^,]表示匹配除了逗号之外的任意字符,这样会在遇到第一个逗号时停止,刚好对应第一个参数的结束
  • ,\s*:匹配分隔第一个和第二个参数的逗号,以及逗号后的空格
  • ([\w._]+):捕获第二个参数,\w._覆盖了函数名可能包含的字母、数字、下划线和点,+表示匹配至少一个字符
  • \s*[,)]:匹配第二个参数后面的逗号(如果还有后续参数)或右括号(如果是最后一个参数),确保我们捕获的是完整的第二个参数

测试代码

把这个正则用到你的字符串上:

import re

c = """ if ( is.data.frame(by) && ncol(by)>1 ) { by_by = sapply( by, paste.me, collapse, split) } ldat = sapply(xdat, by_by ) out = data.table::rbindlist( lapply(ldat, FUN, ...) ) return(out) """

result = re.findall(r"\b[sl]apply\(\s*[^,]+?\s*,\s*([\w._]+)\s*[,)]", c)
print(result)  # 输出: ['paste.me', 'by_by', 'FUN']

这样就能得到你期望的结果啦!

内容的提问来源于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:16:06