Вы можете использовать gsub
для этого:
name <- c("Hello Mr Whatever His Name. How are you ?")
gsub("(.*Hello Mr )[^\\.]*(\\..*)", "\\1\\2", name)
возвращает:
[1] "Hello Mr . How are you ?"
Объяснение:
Выражение выбирает три части:
- Все до и включая Hello Mr
- Все после этого до первой точки.
- Все до и после точки.
Тогда он заменяет всю строку только первой и третьей частями
Редактировать 1: (Отвечая на актуальный вопрос):
gsub("(.*Hello Mr )(?:[A-Za-z]+ ){2}[A-Za-z]+(.*)", "\\1\\2", name)
возвращает:
[1] "Hello Mr . How are you ?"
Объяснение:
- Все до и включая Hello Mr
- 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 ?"