[英]Replacing commas in text inside tags in R
我有一个文本文件( 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
用]+[
替换逗号? 有没有办法使用基础 R 来实现我的目标?
非常感谢。
您可以通过使用嵌套替换的stringr
来执行此操作。 首先找到标签,然后为每个标签替换逗号。 str_replace_all
允许您传递 function 进行转换而不是字符串。
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]."
这里有一些解决方案。
在问题中,方括号内的逗号后面总是跟着一个空格,我认为这是一般情况,但是如果方括号内的逗号后面可以跟一个非空格,那么在每个解决方案中删除模式中逗号之后的空格.
1) gsubfn This one-liner uses gsubfn
which finds the matches to the pattern given in the first argument, passes it to the function (which may be specified as a formula) in the second argument and replaces each match with the output of the function .
在这里它匹配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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.