我有一个文本文件(my.txt
),其中包含我希望在R
中处理的以下内容。
Lorem ipsum tag:[value_0], dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua tag:[value_01, value_02, value_03].
Ut enim ad minim veniam, tag:[value_04, value_05, value_06, value_07] quis nostrud exercitation, tag:[value_08, value_09, value_10].
我希望处理标记内的字符串(tag:[ * ]
)。标记内的值以逗号分隔,由字母数字字符和标点符号(逗号和括号除外)组成。标记内的值的数量是可变的(1或更多)。我希望用]+[
更改逗号。
我希望得到的结果如下:
Lorem ipsum tag:[value_0], dolor sit amet,
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua tag:[value_01]+[value_02]+[value_03].
Ut enim ad minim veniam, tag:[value_04]+[value_05]+[value_06]+[value_07] quis nostrud exercitation, tag:[value_08]+[value_09]+[value_10].
我所能想到的就是捕获标签的内容。
gsub(
pattern = paste0(
"tag:\\[([^]]*)\\]"
),
replacement = "\\1",
x = readLines("my.txt")
)
我不能简单地查找和替换逗号,因为标签之外有逗号。有没有办法进一步处理\\1
,用]+[
代替逗号?有没有办法使用base R来实现我的目标?
非常感谢。
发布于 2020-04-28 21:32:07
您可以使用嵌套替换对stringr
包执行此操作。首先找到标签,然后为每个标签替换逗号。str_replace_all
允许您传递用于转换的函数,而不是字符串。
input <- c(
"orem ipsum tag:[value_0], dolor sit amet",
"consectetur adipiscing elit",
"sed do eiusmod tempor incididunt ut labore et dolore magna aliqua tag:[value_01, value_02, value_03].",
"Ut enim ad minim veniam, tag:[value_04, value_05, value_06, value_07] quis nostrud exercitation, tag:[value_08, value_09, value_10]."
)
stringr::str_replace_all(input, "tag:\\[[^\\]]*\\]", function(x) {
stringr::str_replace_all(x, ", ", "]+[")
})
它会返回
[1] "orem ipsum tag:[value_0], dolor sit amet"
[2] "consectetur adipiscing elit"
[3] "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua tag:[value_01]+[value_02]+[value_03]."
[4] "Ut enim ad minim veniam, tag:[value_04]+[value_05]+[value_06]+[value_07] quis nostrud exercitation, tag:[value_08]+[value_09]+[value_10]."
发布于 2020-04-28 23:19:40
以下是一些解决方案。
在这个问题中,方括号中的逗号后面总是跟着一个空格,我假设这是一般情况,但是如果方括号中的逗号后面可以跟一个非空格,那么在每个解决方案中删除模式中逗号后面的空格。
1) gsubfn此一行代码使用gsubfn
查找与第一个参数中给定的模式匹配的内容,将其传递给第二个参数中的函数(可以指定为公式),并将每个匹配项替换为函数的输出。
在这里,它匹配tag:[
,后跟一个字符串,直到下一个最接近的]
,并使用gsub
在其中执行所需的替换。
library(gsubfn)
gsubfn("tag:\\[.*?\\]", ~ gsub(", ", "]+[", x), Lines)
2) gsub它可以在单个gsub
中完成,但请注意下面的警告。它查找逗号、空格、任意数量的非方括号和右方括号。如果左方括号在前面,或者没有遇到右方括号,它将不匹配。除了逗号空格之外的所有内容都在零宽度的前视中--前视不会被视为模式的一部分,因此只有逗号被替换,而对于更多的逗号和空格字符序列,将继续处理前视部分。
(不幸的是,lookbehind不支持重复字符,所以我们不能使用相同的方法来检查前面的tag:[
。因此,这并不是完全安全的,尽管它的检查似乎对问题中的示例输入以及您的实际输入都足够了。)
这只使用碱基R。
gsub(", (?=[^][]*\\])", "]+[", Lines, perl = TRUE)
2a)这个(2)的变体比(2)长,但它确实会检查tag:[
,并且仍然只使用基数R。它假定输入中没有大括号。如果有大括号,请使用输入中没有的其他字符,例如<和>。首先,它用{...}
替换了tag:[...]
。然后,它执行(2)中的替换,但使用大括号,最后转换回来。
Lines2 <- gsub("tag:\\[(.*?)\\]", "{\\1}", Lines)
Lines3 <- gsub(", (?=[^][{}]*})", "]+[", Lines, perl = TRUE)
gsub("\\{(.*?)\\}", "tag:[\\1]", Lines2)
https://stackoverflow.com/questions/61489977
复制相似问题