2013-04-30 2 views
0

Как я могу обнаружить присутствие более двух последовательных символов в слове и удалить это слово?regex заменить слова более чем на два последовательных символа

я, кажется, чтобы быть в состоянии сделать это следующим образом:

# example data 
mystring <- c(1, 2, 3, "toot", "tooooot") 
# clunky regex 
gsub("^[[:alpha:]]$", "", gsub(".*(.)\\1+\\1", "", mystring)) 
[1] "1" "2" "3" "toot" "" 

Но я уверен, что есть более эффективный способ. Как я могу сделать это только с одним gsub?

ответ

4

Вы можете использовать grepl вместо этого.

mystring <- c(1, 2, 3, "toot", "tooooot", "good", "apple", "banana") 
mystring[!grepl("(.)\\1{2,}", mystring)] 
## [1] "1"  "2"  "3"  "toot" "good" "apple" "banana" 

** Объяснение **
\\1 матчи первая группа (в данном случае (.)). {2,} указывает, что предыдущий символ должен быть сопоставлен как минимум 2 раза или более. Так как мы хотим, чтобы любой символ повторялся 3 раза или более - (.) - это первое появление, \\1 нужно сопоставить 2 раза больше.

+0

Это, кажется, пятно, не возвращающее ничего вместо слова с более чем двумя последовательными символами. Благодаря! – Ben

+1

Отличный ответ. Не могли бы вы немного объяснить? Я получаю все, что делают, кроме '\\ 1' –

+2

@TylerRinker обновляется с объяснением. –

4

Объединить выражения вроде так:

gsub("^[[:alpha:]]*([[:alpha:]])\\1\\1[[:alpha:]]*$", "", mystring) 
+0

три или более такой же, как более два ...? – Aquillo

+0

@Aquillo - О, моя ошибка. Я прочитал название как «два или более» на автопилоте. Редактирование ответа, спасибо. –

+1

+1 для демонстрации внешнего вида. Более простой шаблон может быть: '.. + ([[: Alpha:]]) \\ 1 \\ 1. +" ' –

0

Другая возможность:

mystring[grepl("(.{1})\\1{2,}", mystring, perl=T)] <- "" 
+0

Да, интересная вариация на ответе @ geektrader, спасибо – Ben

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