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

r replace text within a string by lookup table

我已经尝试在 Internet 上为我的问题找到解决方案,我感觉我知道所有的小部分,但我无法将它们组合在一起。我对编程很了解所以请耐心等待 :D...

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

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

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

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、合并、str_replace,但我发现自己无法使其工作...我不知道如何告诉R!查看括号内的内容,在查找中查找相同的参数 table 并给出下一列中的内容。

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

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

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

或通过 paste 在 'lookup'

的每一列上加上方括号来进行无正则表达式环视
gsubfn("(\[\d+\])", setNames(as.list(paste0("[", lookup$orderedNbr, 
          "]")), paste0("[", lookup$Number, "]")), string)

将 table 键和值(2 列 table)读入数据框。如果您的源信息是一个平面文本文件,那么您可以轻松地使用 read.csv 来获取数据框。在下面的示例中,我硬编码了一个只有两个条目的数据框。然后,我遍历它并在输入字符串中进行替换。

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."

Demo

注意:正如@Frank 明智地指出的那样,如果您的数字标记(例如 [438])恰好有替换数字也作为其他标记出现,我的解决方案就会失败。也就是说,如果用一个值替换一个键会导致另一个键,则可能会出现问题。如果这是可能的,我建议使用不会发生这种情况的标记。例如,您可以在每次替换后删除括号。

您可以将 regmatches<- 与包含 lookahead/lookbehind:

的模式一起使用
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)])