我有一些字符串,如下所示:
> 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:]*)(?=\\))")
,但是(显然)这没有用。任何指针将不胜感激。
答案 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*
符号,并返回修改后的匹配项,并替换为$
找到的正则表达式匹配项。