r通过查找表替换字符串中的文本

时间:2018-04-27 14:43:44

标签: r string replace lookup lookup-tables

我已经尝试在互联网上为我的问题找到一个解决方案,我觉得我知道所有小块但我无法把它们放在一起。我非常了解编程,所以请耐心等待:D ......

我有一个(实际上更大)文本字符串,如下所示:

string <- "Test test [438] test. Test 299, test [82]."

现在我想使用查找表替换方括号中的数字并返回一个新字符串。文中还有其他数字,但我只想更改括号中的数字,并需要将它们放回括号中。

lookup <- read.table(text = "
Number   orderedNbr
1 270 1
2 299 2
3 82  3
4 314 4
5 438 5", header = TRUE)

我制作了一个模式,使用正则表达式找到方括号

pattern <- "\\[(\\d+)\\]"

现在我四处寻找并尝试了sub / gsub,lapply,merge,str_replace,但我发现自己无法使其工作......我不知道怎么告诉R!查看括号内的内容,在查找表中查找相同的参数,并列出下一栏中的内容。

我希望你能帮助我,而且这不是一个非常愚蠢的问题。 THX

3 个答案:

答案 0 :(得分:2)

我们可以使用正则表达式查看仅匹配方括号内的数字

library(gsubfn)
gsubfn("(?<=\\[)(\\d+)(?=\\])", setNames(as.list(lookup$orderedNbr), 
             lookup$Number), string, perl = TRUE)
#[1] "Test test [5] test. Test [3]."

或者paste每个“查找”列上的方括号都没有正则表达式的外观

gsubfn("(\\[\\d+\\])", setNames(as.list(paste0("[", lookup$orderedNbr, 
          "]")), paste0("[", lookup$Number, "]")), string)

答案 1 :(得分:2)

将您的键和值表(2列表)读入数据框。如果源信息是平面文本文件,则可以轻松使用git checkout v1.0 git submodule update git submodule 来获取数据框。在下面的示例中,我只使用两个条目对数据帧进行硬编码。然后,我迭代它并在输入字符串中进行替换。

read.csv

Demo

注意:正如@Frank明智地指出的那样,如果您的数字标记(例如df <- data.frame(keys=c(438, 82), values=c(5, 3)) string <- "Test test [438] test. Test [82]." for (i in 1:nrow(df)) { string <- gsub(paste0("(?<=\\[)", df$keys[i], "(?=\\])"), df$values[i], string, perl=TRUE) } string [1] "Test test 5 test. Test 3." )碰巧有替换数字也会出现作为其他标记,那么我的解决方案将会失败。也就是说,如果用值替换键导致另一个键,则可能存在问题。如果这是一种可能性,我建议使用不会发生这种情况的标记。例如,您可以在每次更换后删除括号。

答案 2 :(得分:1)

您可以将regmatches<-与包含前瞻/后瞻的模式一起使用:

patt = "(?<=\\[)\\d+(?=\\])"
m = gregexpr(patt, string, perl=TRUE)
v = as.integer(unlist(regmatches(string, m)))

`regmatches<-`(string, m, value = list(lookup$orderedNbr[match(v, lookup$Number)]))
# [1] "Test test [5] test. Test 299, test [3]."

或者直接修改字符串,将最后一行更改为更易读...

regmatches(string, m) <- list(lookup$orderedNbr[match(v, lookup$Number)])