2012-06-22 133 views
9

我想實現一個功能R,刪除字符串中的重複字符。例如,假設我的功能被命名爲removeRS,所以它應該是這種方式工作:如何用R刪除字符串中的重複字符?

removeRS('Buenaaaaaaaaa Suerrrrte') 
    Buena Suerte 
    removeRS('Hoy estoy tristeeeeeee') 
    Hoy estoy triste 

我的功能是要以西班牙語撰寫的字符串中使用,所以它不是常見的(或至少是正確的)發現連續超過三個元音的單詞。不用擔心他們背後的可能情緒。儘管如此,有些詞可以有兩個連續的輔音(尤其是ll和rr),但我們可以從我們的功能中跳過這一點。

所以,總結一下,這個函數應該替換至少連續出現三次的字母。在上面的例子之一中,aaaaaaaaa被替換爲a

你可以給我任何提示來執行此任務與R

+0

「這個任務」目前沒有明確說明。尾隨重複的元音可能需要以不同的方式處理,但從描述中不清楚。 –

回答

19

我沒仔細考慮這一點,但是這是我使用正則表達式中引用快速的解決方案:

gsub('([[:alpha:]])\\1+', '\\1', 'Buenaaaaaaaaa Suerrrrte') 
# [1] "Buena Suerte" 

()捕獲信第一,\\1指信,+裝置一次或多次匹配它;把所有這些碎片放在一起,我們可以匹配一個字母兩次或更多次。

要包含除字母數字之外的其他字符,請用正則表達式替換[[:alpha:]],以匹配您希望包含的任何字符。

+1

謝謝,如果你想從這個排除一些字母呢?例如,排除字母L和R. – Nestorghh

+0

'[:alpha:]'表示'a-zA-Z';如果你想具體,你可以說,例如'[a-zA-KM-QS-Z]'去除大寫字母L和R;參見'?regexp' –

+0

這是一個使用perl樣式的零寬度lookahead regexp的變體:'gsub(「([=:1)」,「」,s,perl = TRUE) '。它匹配除了最後一個字母字符以外的所有字符。 –

5

我認爲你應該注意你的問題描述中的含糊之處。這是第一個嘗試,但它顯然不符合「好運」的方式,你的願望的工作:

removeRS <- function(str) paste(rle(strsplit(str, "")[[1]])$values, collapse="") 
removeRS('Buenaaaaaaaaa Suerrrrte') 
#[1] "Buena Suerte" 
+0

感謝您的回答@DWin。 「祝你好運」的例子根本不打擾我,我接受併爲這些含糊之處道歉。在這個意義上,英語中的事物並不像西班牙語那樣工作。我嘗試了你的解決方案,並按我的願望工作。順便說一下,我編輯了這個問題,以便更清楚地說明問題。 – Nestorghh

0

既然你要替換至少出現3次信件,這裏是我的解決方案:

gsub("([[:alpha:]])\\1{2,}", "\\1", "Buennaaaa Suerrrtee") 
#[1] "Buenna Suertee" 

正如你所看到的4個「一」已經縮小到只有1中,3 r具有減少到1 r,但2 n和2 e沒有改變。 如上建議你可以通過[a-zA-KM-Z]或類似的任意組合取代[[:alpha:]],甚至用「或」運算符|的squre括號內[y|Q]如果你希望你的代碼影響的僅Y重複和Q.

gsub("([a|e])\\1{2,}", "\\1", "Buennaaaa Suerrrtee") 
# [1] "Buenna Suerrrtee" 
# triple r are not affected and there are no triple e.