gsub("\\s[A-Za-z](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am text and here"
Поскольку вы хотите сохранить один a
, вы можете использовать любое из следующих значений для более специфичных c шаблонов:
### just three letters: r o n
gsub("\\s[orn](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am a text and here"
### any single-letter except "a" and "i"
gsub("\\s[B-HJ-Zb-hj-z](?= )", "", "I am a text r r o n n r and here", perl = TRUE)
# [1] "I am a text and here"
(Исключение составляет i
в второй пример здесь не нужен строго, но приведен в качестве примера.)
Использование « упреждающего просмотра » ((?= )
используется, поскольку вы указали требование для пробел до и после, если вы используете шаблон "\\s[orn]\\s"
, то он пропустит много отдельных букв (из-за рекурсивных замен). Если вы немного ослабите это, то вы можете использовать границы слов, как в
gsub("\\s[B-HJ-Zb-hj-z]\\b", "", "I am a text r r o n n r and here")
(Хотя регулярные выражения в стиле perl могут технически привести к снижению производительности, я подозреваю, что это действительно имеет значение только в том случае, если вы много делаете и нуждаетесь в повышении производительности настолько, насколько можете. Не строго требуется, и ранняя оптимизация - это «root всего зла» - Дональд Кнут )
Примечание: В этом последнем паттерне я также исключаю строчные буквы i
в дополнение к прописным буквам I
; если вы уверены, что никогда не увидите действительный в противном случае i
, тогда вы можете настроить свой шаблон так, чтобы использовать [B-HJ-Zb-z]
. (Спасибо @ jay.sf за выделение этого предположения.)