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."
注意:正如@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)])
我已经尝试在 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."
注意:正如@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)])