您可以通过以下方式将 您当前的模式与gsubfn 一起使用:
library(gsubfn)
x <- " lag.variable0.3 * lag.variable1.1+1 + 9892"
p <- "(\\.\\w+)\\.([0-9]+\\+[0-9]+)"
gsubfn(p, function(n,m) paste0(n, ".", eval(parse(text = m))), x)
# => [1] " lag.variable0.3 * lag.variable1.2 + 9892"
请注意,在这种情况下,将匹配传递给可调用对象,其中组 1 分配给 n 变量,组 2 分配给 m。返回是第 1 组、. 和 evaled 第 2 组内容的串联。
请注意,您可以使用 PCRE 正则表达式(添加 perl=TRUE 参数)\K 来简化可调用部分,匹配重置运算符会丢弃迄今为止匹配的所有文本:
p <- "\\.\\w+\\.\\K(\\d+\\+\\d+)"
gsubfn(p, ~ eval(parse(text = z)), x, perl=TRUE)
[1] " lag.variable0.3 * lag.variable1.2 + 9892"
您可以通过将\\+ 替换为[-+/*] 来进一步增强模式以支持其他操作数,如果您需要支持带小数部分的数字,请将[0-9]+ 替换为\\d*\\.?\\d+:
p <- "(\\.\\w+)\\.(\\d*\\.?\\d+[-+/*]\\d*\\.?\\d+)"
## or a PCRE regex:
p <- "\\.\\w+\\.\\K(\\d*\\.?\\d+[-+/*]\\d*\\.?\\d+)"