Регулярное выражение - убрать poly () из формулы - PullRequest
0 голосов
/ 15 января 2019

У меня есть формула в R как символьный вектор, и мне нужно удалить poly() из этой формулы, если она есть.

Пример, и некоторые из моих (не успешных) попыток до сих пор:

p <- "(.*)poly\\((\\w.*)(.*)(\\))(.*)"
unique(sub(p, "\\1", "mined + poly(cover, 3) + spp"))
#> [1] "mined + "
unique(sub(p, "\\2", "mined + poly(cover, 3) + spp"))
#> [1] "cover, 3"
unique(sub(p, "\\3", "mined + poly(cover, 3) + spp"))
#> [1] ""
unique(sub(p, "\\4", "mined + poly(cover, 3) + spp"))
#> [1] ")"
unique(sub(p, "\\5", "mined + poly(cover, 3) + spp"))
#> [1] " + spp"

Мой желаемый результат:

Ввод: "mined + poly(cover, 3) + spp"

Выход: "mined + cover + spp"

Я пробовал так много шаблонов, но либо poly( ..., 3) не был удален, либо , 3) или , 3 остались в результирующей строке ... Любая помощь приветствуется! (кстати, 3 является произвольным, шаблон должен удалить любое значение степени ...)

Ответы [ 2 ]

0 голосов
/ 15 января 2019
gsub("poly\\((.+),\\s*\\d+\\)", "\\1", inp)
# [1] "mined + cover + spp"

Или пошаговым способом (так как вы боретесь с более сложным регулярным выражением):

library(magrittr)
gsub("[^a-zA-Z]", " ", inp) %>% # Drop everything that is not a letter, add space instead
  gsub("poly", "", .) %>%       # Drop the word poly 
  gsub("\\s+", " + ", .)        # Add '+' back in. '\\s+' stands for one or more spaces
# [1] "mined + cover + spp"
0 голосов
/ 15 января 2019

Попробуйте это регулярное выражение:

poly\(([^,]*)[^)]*\)

Заменить совпадение содержимым группы 1

Нажмите для демонстрации

Пояснение:

  • poly\( - совпадения poly(
  • ([^,]*) - соответствует 0+ вхождений любого символа, который не является ,. Это захвачено в Группе 1
  • [^)]*\) - соответствует 0+ вхождений любого символа, который не является ), за которым следует )

Теперь заменить все совпадение на содержимое группы 1

...