Удалить последовательные слова в верхнем регистре из строки - PullRequest
1 голос
/ 30 мая 2020

У меня длинная строка, в которой я хотел бы удалить последовательные слова с прописными буквами (2+ в строке), и если пунктация следует за последним словом в верхнем регистре, это тоже. Но в то же время я хотел бы сохранить отдельные слова в верхнем регистре и слова в верхнем регистре, которые являются частью "смешанного" слова (см. "REPEX").

string <- "Lorem ipsum DOLOR SIT AMET? consectetuer adipiscing elit. Morbi gravida libero NEC velit. Morbi scelerisque luctus velit. ETIAM-123 dui sem, fermentum vitae, SAGITTIS ID? malesuada in, quam. Proin mattis lacinia justo. Vestibulum facilisis auctor urna. Aliquam IN LOREM SIT amet leo accumsan"

#remove all consecutive UPPERCASE words including punctation (--> DOLOR SIT AMET?), but not single uppercase words (--> NEC) or "mixed" words with uppercase and digits (--> ETIAM-123)
#this doesn't work:
string %>% 
  stringr::str_remove_all("\\b[:upper:]+\\b")
#> [1] "Lorem ipsum   ? consectetuer adipiscing elit. Morbi gravida libero  velit. Morbi scelerisque luctus velit. -123 dui sem, fermentum vitae,  ? malesuada in, quam. Proin mattis lacinia justo. Vestibulum facilisis auctor urna. Aliquam    amet leo accumsan"

Создано 30.05.2020 с помощью пакета REPEX (v0.3.0)

Любые подсказки приветствуются:)

Ответы [ 2 ]

5 голосов
/ 30 мая 2020

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

string <- "Lorem ipsum DOLOR SIT AMET? consectetuer adipiscing elit. Morbi gravida libero NEC velit. Morbi scelerisque luctus velit. ETIAM-123 dui sem, fermentum vitae, SAGITTIS ID? malesuada in, quam. Proin mattis lacinia justo. Vestibulum facilisis auctor urna. Aliquam IN LOREM SIT amet leo accumsan"
gsub("\\s*\\b\\p{Lu}{2,}(?:\\s+\\p{Lu}{2,})+\\b[\\p{P}\\p{S}]*", "", string, perl=TRUE)

Вывод:

[1] "Lorem ipsum  consectetuer adipiscing elit. Morbi gravida libero NEC velit. Morbi scelerisque luctus velit. ETIAM-123 dui sem, fermentum vitae,  malesuada in, quam. Proin mattis lacinia justo. Vestibulum facilisis auctor urna. Aliquam  amet leo accumsan"

См. Демонстрацию R и regex demo .

Подробности

  • \s* - 0 или более пробелов
  • \b - граница слова
  • \p{Lu}{2,} - два или более заглавных букв
  • (?:\s+\p{Lu}{2,})+ - 1 или более вхождений 1+ пробелов, за которыми следуют 2 или более заглавных букв
  • \b - граница слова
  • [\p{P}\p{S}]* - любые 0 и более символов или знаков препинания
2 голосов
/ 30 мая 2020

Возможно это?

stringr::str_remove_all(string, "([[:upper:]]+ )+[[:upper:]]+( |[:punct:])*")
#> [1] "Lorem ipsum consectetuer adipiscing elit. Morbi gravida libero NEC velit. Morbi scelerisque luctus velit. ETIAM-123 dui sem, fermentum vitae, malesuada in, quam. Proin mattis lacinia justo. Vestibulum facilisis auctor urna. Aliquam amet leo accumsan"

Создано 30.05.2020 с помощью пакета REPEX (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...