2013-04-30 84 views
0

如何檢測單詞中多於兩個連續字符的存在並刪除該單詞?用正則表達式替換兩個以上連續字符的文字

我似乎能夠做到這一點是這樣的:

# 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 2013-04-30 07:31:25

+1

偉大的迴應。你願意解釋一下嗎?除了'\\ 1'外,我得到了所有片段正在做的事。 – 2013-05-01 01:47:37

+2

@TylerRinker更新瞭解釋。 – 2013-05-01 08:09:28

4

結合表達式,像這樣:

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

三個或更多的是兩個以上相同......? – Aquillo 2013-04-30 07:18:34

+0

@Aquillo - 哦,我的錯。我在自動駕駛儀上看到「兩個或更多」的標題。編輯答案,謝謝。 – 2013-04-30 07:19:20

+1

+1用於展示回顧。更簡單的模式可能是:'「。+([[:alpha:]])\\ 1 \\ 1。+」' – 2013-04-30 07:22:43

0

的另一種可能性:

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

是的,@ geektrader的答案是一個有趣的變體,謝謝 – Ben 2013-04-30 07:34:15