R / stringr:正则表达式,用于获取字符串特定部分内的特定符号

时间:2019-03-20 15:18:31

标签: r regex tidyr stringr

我有一些字符串,如下所示:

> TstStr <- c("Carnivora, Caniformia, Canidae (dog, coyote, wolf, fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)")
> TstStr
[1] "Carnivora, Caniformia, Canidae (dog, coyote, wolf, fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)"
  

如果圆括号内的逗号和空格同时出现,我想用它们来代替(仅),最好使用stringr:str_replace_all(或类似的东西)。所以我希望输出看起来像这样:

> TstStr
[1] "Carnivora, Caniformia, Canidae (dog$coyote$wolf$fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)"

我不知道这种情况下的正则表达式应该是什么样,因为我对正则表达式的了解还很初级。我尝试了str_match_all(Tstr, "(?<=\\()(?:[:alpha:]*)\\,\\s(?:[:alpha:]*)(?=\\))"),但是(显然)这没有用。任何指针将不胜感激。

1 个答案:

答案 0 :(得分:2)

您可以使用

library(stringr)
TstStr <- c("Carnivora, Caniformia, Canidae (dog, coyote, wolf, fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)")
str_replace_all(TstStr, "\\([^()]*\\)", function(x) { gsub("\\s*,\\s*", "$", x) })
[1] "Carnivora, Caniformia, Canidae (dog$coyote$wolf$fox), Canis, Canis lupus (Gray wolf), Canis lupus familiaris (Dog) (Canis familiaris)"

\\([^()]*\\)模式将匹配内部没有括号的(...)子字符串,而带有gsub模式的"\\s*,\\s*"则将用0+空格字符括起来的逗号替换为{{1 }}中的字符。

正则表达式交易

  • $-一个\(字符
  • (-除[^()]*(之外的0个或更多字符
  • )-一个\)字符。

与此模式匹配的字符串将传递给匿名函数,该函数是)的第三个参数,然后str_replace_all替换

的所有情况
  • gsub-0个或多个空格
  • \s*-逗号
  • ,-0个或多个空格

在整个匹配项中带有\s*符号,并返回修改后的匹配项,并替换为$找到的正则表达式匹配项。