繁体   English   中英

替换 R 中标签内文本中的逗号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM