Вы можете использовать
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+ пробельных символов, с $
символами внутри совпадений.
Regex detals
\(
- (
char
[^()]*
- 0 или более символов, отличных от (
и )
\)
- )
char.
Строки, соответствующие этому шаблону, передаются анонимной функции, которая является третьим аргументом str_replace_all
, а затем gsub
заменяет все регистры
\s*
- 0 или более пробелов
,
- запятая
\s*
- 0 или более пробелов
с $
символами во всем совпадении, и измененные совпадения возвращаются обратно и используются в качестве замены для совпадений регулярных выражений, найденных с str_extract_all
.