通过R中的regex轻松查找和替换动态值({{example}})

时间:2014-06-20 04:25:18

标签: regex r

我从json格式的{{example_value}}获得了一些动态值。我有一些R代码来计算实际值。但是,我发现用实际值替换占位符的唯一解决方案是非常漫长和丑陋。

有没有人有任何整洁的解决方案?

{{example_value}}替换为5.5

的示例
> gsub( gsub("\\}","\\\\}",gsub("\\{","\\\\{","{{example_value}}")), 
5.5, "{{example_value}}")

[1] "5.5"

另一个例子解释了为什么我写了嵌套的gsub:

dictionary = "{{example_value}}"
> gsub( gsub("\\}","\\\\}",gsub("\\{","\\\\{",dictionary)), 
5.5, "{{example_value}}")

[1] "5.5"

通常dictionary是一个列表,其中包含我希望替换的所有动态值。

3 个答案:

答案 0 :(得分:2)

您可以使用:

gsub("{{example_value}}", "5.5", subject, perl=TRUE);

答案 1 :(得分:1)

虽然@ zx81的建议似乎最适合直接替换,但您也可以使用正则表达式来提取大括号中的标记。

a<-"The total is {{example}} dollars less"
m <- regexpr("{{([^}]+)}}", a, perl=T)
regmatches(a, m)
# [1] "{{example}}"

然后regmatches有一个很好的功能,您可以轻松替换匹配

regmatches(a, m) <- 5.5
a
# [1] "The total is 5.5 less"

这是一种巧妙的技巧。

答案 2 :(得分:1)

编辑:也许这可能会引导您找到您想要的内容。

re  <- c('{{foo}}', '{{bar}}')
val <- c('5.5',  '1.1')

recurse <- function(pattern, repl, x) {
    for (i in 1:length(pattern))
       x <- gsub(pattern[i], repl[i], x, perl=T)
       x
}

x <- 'I have {{foo}} and {{bar}}'
recurse(re, val, x)

# [1] "I have 5.5 and 1.1"