2016-03-02 6 views
1

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

str="I have a cat of white color" 
str=gsub("([[:space:]][[a-z]][[:space:]])", "", str) 
+1

Я считаю, что это сработало бы для вас: 'GSUB ("[[: пространство:]] [аз] [[: пространство:]]", "", ул) '. Обратите внимание, что класс символов '[a-z]' имеет только одну скобку вокруг него. – MrFlick

+0

@MrFlick: Это не работает. –

+0

@MrFlick: Да С самой строкой. Он не удалил 'a'. –

ответ

0

Необходимо использовать свойство regex квантора, например. [a-z]{2}, который соответствует буквам a по z дважды вместе. Шаблон регулярного выражения вы хотите что-то вдоль линий этого:

\\s[a-z]{2}\\s 

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

str <- "I have a cat of white color" 
nchars <- 2 
exp <- paste0("\\s[a-z]{", nchars, "}\\s") 

> gsub(exp, "", str) 
[1] "I have a catwhite color" 
2

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

Идея неправильная, слово не всегда окружено пробелами. Что делать, если слова находятся в начале строки? Или в конце? Или следует пунктуация?

Использование \b word boundary:

Есть три различные позиции, которые квалифицируются как словоразделами:
- До первого символа в строке, если первый символ является символом слова ,
- После последнего символа в строке, если последний символ является символом слова.
- Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

ПРИМЕЧАНИЕ, что в R, при использовании gsub, то лучше использовать его с регулярным выражением PCRE (передвигайте perl=T):

POSIX 1003,2 режим gsub и gregexpr не работает правильно с повторяющимися границами слов (например, pattern = "\b"). Для таких совпадений используйте perl = TRUE (но это может работать не так, как ожидалось, с входами, отличными от ASCII, поскольку значение слова «зависит от системы»).

Таким образом, чтобы соответствовать всем 1-буквенные слова, вы должны использовать

gsub("(?i)\\b[a-z]\\b", "REPLACEMENT", input, perl=T) ## To replace 1 ASCII letter words 

Обратите внимание, что (?i) является модификатором нечувствительны к регистру (что делает a матч как a и A).

Теперь, вы должны соответствовать 2 слова письма:

gsub("(?i)\\b[a-z]{2}\\b", "REPLACEMENT", input, perl=T) ## To replace 2 ASCII letter words 

Здесь мы используем limiting quantifier{min, max}/{max}, чтобы указать, сколько раз шаблон количественно с этой конструкцией, можно повторить.

См IDEONE demo:

> input = "I am a football fan" 
> gsub("(?i)\\b[a-z]\\b", "REPLACEMENT", input, perl=T) ## To replace 1 ASCII letter words 
[1] "REPLACEMENT am REPLACEMENT football fan" 
gsub("(?i)\\b[a-z]{2}\\b", "REPLACEMENT", input, perl=T) ## To replace 2 ASCII letter words 
[1] "I REPLACEMENT a football fan" 
+1

Большое спасибо Мне нужен небольшой подробный пример, и вот он. –

Смежные вопросы