Удалить все слова в строке, содержащей пунктуацию (R) - PullRequest
1 голос
/ 06 июня 2019

Как (в R) я могу удалить любое слово в строке, содержащей знаки препинания, оставляя слова без?

  test.string <- "I am:% a test+ to& see if-* your# fun/ction works o\r not"

  desired <- "I a see works not"

Ответы [ 3 ]

4 голосов
/ 06 июня 2019

Вот подход с использованием sub, который, кажется, работает:

test.string <- "I am:% a test$ to& see if* your# fun/ction works o\r not"
gsub("[A-Za-z]*[^A-Za-z ]\\S*\\s*", "", test.string)

[1] "I a see works not"

Этот подход заключается в использовании следующего шаблона регулярных выражений:

[A-Za-z]*     match a leading letter zero or more times
[^A-Za-z ]    then match a symbol once (not a space character or a letter)
\\S*          followed by any other non whitespace character
\\s*          followed by any amount of whitespace

Затем мы просто заменим напустая строка, чтобы удалить слова, содержащие один или несколько символов.

2 голосов
/ 06 июня 2019

Вы можете использовать это регулярное выражение

(?<=\\s|^)[a-z0-9]+(?=\\s|$)
  • (?<=\\s|^) - положительный взгляд сзади, совпадению должен предшествовать пробел или начало строки.
  • [a-z0-9]+ - Совпадение алфавитов и цифр один или несколько раз,
  • (?=\\s|$) - за соответствием должен следовать пробел или конец строки

Демо

Правка Тима:

Этот ответ использует подход белого списка, а именно идентифицирует все слова, которые ОП хочет сохранить в своем выводе. Мы можем попробовать сопоставление, используя приведенный выше шаблон регулярного выражения, а затем соединить вектор совпадений, используя paste:

test.string <- "I am:% a test$ to& see if* your# fun/ction works o\\r not"
result <- regmatches(test.string,gregexpr("(?<=\\s|^)[A-Za-z0-9]+(?=\\s|$)",test.string, perl=TRUE))[[1]]
paste(result, collapse=" ")

[1] "I a see works not"
0 голосов
/ 06 июня 2019

Вот еще пара подходов

Первый подход:

str_split(test.string, " ", n=Inf) %>%  # spliting the line into words
unlist %>% 
.[!str_detect(., "\\W|\r")] %>%         # detect words without punctuation or \r
paste(.,collapse=" ")                   # collapse the words to get the line

Второй подход:

str_extract_all(test.string, "^\\w+|\\s\\w+\\s|\\w+$") %>% 
unlist %>% 
trimws() %>% 
paste(., collapse=" ")
  • ^\\w+ - слова, имеющие только [a-zA-Z0-9_], а также начало строки
  • \\s\\w+\\s - слова с [a-zA-Z0-9_] и имеющие пробел до и после слова
  • \\w+$ - слова, имеющие [a-zA-Z0-9_] и также являющиеся концом строки
...