Удалить список целых слов, которые могут содержать специальные символы из символьного вектора без совпадения частей слов - PullRequest
0 голосов
/ 04 июля 2018

У меня есть список слов в R, как показано ниже:

 myList <- c("at","ax","CL","OZ","Gm","Kg","C100","-1.00")

И я хочу удалить слова, которые находятся в приведенном выше списке из текста, как показано ниже:

 myText <- "This is at Sample ax Text, which CL is OZ better and cleaned Gm, where C100 is not equal to -1.00. This is messy text Kg."

После удаления нежелательных слов myList текст myText должен выглядеть следующим образом:

  This is at Sample Text, which is better and cleaned, where is not equal to. This is messy text.

Я использовал:

  stringr::str_replace_all(myText,"[^a-zA-Z\\s]", " ")

Но это не помогает мне. Что я должен делать ??

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вы можете использовать регулярное выражение PCRE с функцией gsub base R (оно также будет работать с регулярным выражением ICU в str_replace_all):

\s*(?<!\w)(?:at|ax|CL|OZ|Gm|Kg|C100|-1\.00)(?!\w)

См. Демоверсию regex .

Подробнее

  • \s* - 0 или более пробелов
  • (?<!\w) - отрицательный взгляд сзади, гарантирующий отсутствие слова char непосредственно перед текущим местоположением
  • (?:at|ax|CL|OZ|Gm|Kg|C100|-1\.00) - группа без захвата, содержащая экранированных элементов внутри вектора символов со словами, которые необходимо удалить
  • (?!\w) - отрицательный прогноз, который гарантирует, что после текущего местоположения нет слова char.

ПРИМЕЧАНИЕ : здесь нельзя использовать границу слова \b, поскольку элементы в символьном векторе myList могут начинаться / заканчиваться несловесными символами, тогда как \b означает зависит от контекста.

См. R демо онлайн :

myList <- c("at","ax","CL","OZ","Gm","Kg","C100","-1.00")
myText <- "This is at Sample ax Text, which CL is OZ better and cleaned Gm, where C100 is not equal to -1.00. This is messy text Kg."
escape_for_pcre <- function(s) { return(gsub("([{[()|?$^*+.\\])", "\\\\\\1", s)) }
pat <- paste0("\\s*(?<!\\w)(?:", paste(sapply(myList, function(t) escape_for_pcre(t)), collapse = "|"), ")(?!\\w)")
cat(pat, collapse="\n")
gsub(pat, "", myText, perl=TRUE)
## => [1] "This is Sample Text, which is better and cleaned, where is not equal to. This is messy text."

Детали

0 голосов
/ 04 июля 2018
gsub(paste0(myList, collapse = "|"), "", myText)

дает:

[1] "This is  Sample  Text, which  is  better and cleaned , where  is not equal to . This is messy text ."
...