Как заменить слова, которые приходят указанное c слово и имеет первую букву в верхнем регистре с R - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь найти способ заменить 3 следующих слова, которые идут после указанного c и имеют первую букву в верхнем регистре. Мне нужно это, чтобы удалить имя в корпусе.

Например, вот что у меня есть:

name <- c("Hello Mr Whatever His Name. How are you ?")

И что мне нужно:

Hello Mr . How are you ?"

Я не смог найти ничего похожего в переполнении стека.

Ответы [ 2 ]

3 голосов
/ 07 февраля 2020

Вы можете использовать gsub для этого:

name <- c("Hello Mr Whatever His Name. How are you ?")
gsub("(.*Hello Mr )[^\\.]*(\\..*)", "\\1\\2", name)

возвращает:

[1] "Hello Mr . How are you ?"

Объяснение:

Выражение выбирает три части:

  1. Все до и включая Hello Mr
  2. Все после этого до первой точки.
  3. Все до и после точки.

Тогда он заменяет всю строку только первой и третьей частями

Редактировать 1: (Отвечая на актуальный вопрос):

gsub("(.*Hello Mr )(?:[A-Za-z]+ ){2}[A-Za-z]+(.*)", "\\1\\2", name)

возвращает:

[1] "Hello Mr . How are you ?"

Объяснение:

  1. Все до и включая Hello Mr
  2. 3 слова подряд
  3. Все после этого

Отказ от ответственности : Вы должны запустить несколько тестов, чтобы убедиться, что это работает для всех возможных случаев ...

Редактировать 2: Пределы рекомендуемого регулярного выражения:

name <- c("Hello Mr One two Three. How are you ?",
          "Hello Mr One Two Three. How are you ?",
          "Hello Mr one two three How are you ?",
          "Hello Mr ONE Two. Three. How are you ?",
          "Hello Mr _ . ) How are you ?")

gsub("(.*Hello Mr )(?:[A-Za-z]+ ){2}[A-Za-z]+(.*)", "\\1\\2", name)

возвращает:

[1] "Hello Mr . How are you ?"              
[2] "Hello Mr . How are you ?"              
[3] "Hello Mr  How are you ?"               
[4] "Hello Mr ONE Two. Three. How are you ?"
[5] "Hello Mr _ . ) How are you ?"     
1 голос
/ 07 февраля 2020

Возможно, вы можете попробовать следующий код

gsub(gsub(".*Hello Mr (([A-Z][a-z]+\\s){2}[A-Z][a-z]+).*","\\1",name),"",name)

, где внутренний gsub предназначен для извлечения шаблона, который нужно удалить, а внешний gsub - для удаления совпавшего шаблона.

Или метод, аналогичный подходу @ dario

gsub("(.*Hello Mr )(?:([A-Z][a-z]+\\s){2}[A-Z][a-z]+)(.*)","\\1\\3",name)

такой, что

# [1] "Hello Mr . How are you ?"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...