R / stringr: регулярное выражение для получения определенного символа в определенной части строки - PullRequest
1 голос
/ 20 марта 2019

У меня есть несколько строк символов, таких как приведенная ниже:

> 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 Ответ

2 голосов
/ 20 марта 2019

Вы можете использовать

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.

...