【问题标题】:Replacing text in gsub by evaluating a backreference通过评估反向引用替换 gsub 中的文本
【发布时间】:2020-12-05 18:24:09
【问题描述】:

假设我有一些文字:

myF <- "lag.variable.1+1"

我想为所有类似的表达式得到以下结果:lag.variable.2(即用实际总和替换 1+1

以下似乎不起作用,反向引用似乎没有在 eval(parse() 位)中进行:

myF<-gsub("(\\.\\w+)\\.([0-9]+\\+[0-9]+)", 
            paste0( "\\1." ,eval(parse(text ="\\2"))) ,
            myF )

关于如何达到预期结果的任何提示? 谢谢!

【问题讨论】:

    标签: r regex gsub backreference


    【解决方案1】:

    您可以通过以下方式将 您当前的模式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+)"
    

    【讨论】:

      【解决方案2】:

      我们可以使用gsubfn

      library(gsubfn)
      gsubfn("(\\d+\\+\\d+)", ~ eval(parse(text = x)), myF)
      #[1] "lag.variable.2"
      
       gsubfn("\\.([0-9]+\\+[0-9]+)", ~ paste0(".", eval(parse(text = x))), myF2)
      #[1] "lag.variable0.3 * lag.variable1.2 + 9892"
      

      str_replace

      library(stringr)
      str_replace(myF, "(\\d+\\+\\d+)", function(x) eval(parse(text = x)))
      #[1] "lag.variable.2"
      

      strsplitpaste 的选项

      v1 <- strsplit(myF, "\\.(?=\\d)", perl = TRUE)[[1]]
      paste(v1[1], eval(parse(text = v1[2])), sep=".")
      #[1] "lag.variable.2"
      

      数据

      myF <- "lag.variable.1+1"
      myF2 <- "lag.variable0.3 * lag.variable1.1+1 + 9892"
      

      【讨论】:

      • 谢谢!当字符串像示例中的那样被隔离时,这些确实有效。但是,如果表达式是较长字符串的一部分,例如“ lag.variable.3 * lag.variable.1.1 + 9892”
      • @satellite42 也不清楚您要添加哪一个以及是否还需要乘法?
      • @satellite42 您评论的字符串的预期输出是什么
      • 我的错,第二个例子是一个糟糕的复制粘贴。为了更正,我有像第二个例子这样的公式(“ lag.variable0.3 * lag.variable1.1+1 + 9892”),我需要它变成 " lag.variable0.3 * lag.variable1.2 + 9892" 。感谢您的帮助:)
      • @satellite42 将帖子更新为gsubfn
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      • 2015-02-14
      • 1970-01-01
      相关资源
      最近更新 更多