2012-03-05 14 views
3

あなたのために少し奇妙な質問 - 文字列のすべての繰り返し文字を置き換えることを希望している問題を解決しましたが、例は次のとおりです。gsub - すべての繰り返し文字を1つのインスタンスに減らす

txt <- "haarbbbbbbijjjjjan" 
gsub("([a-z])\\1+", "\\1", txt) 
[1] "harbijan" 

が、これは単に(検索用語の用語+繰り返しを検索)各文字のすべての繰り返しインスタンスを照合して、文字検索に置き換えますか?それとも、これが私が完全に把握していない意図しない何かをしていますか?

答えて

7

azの間の任意の記号を宣言しました。 \\1はこのグループを参照します。このグループの任意の数の反復がグループ値に代入されます。たとえば、グループがaの場合、任意の数のaがグループ値で置き換えられます。 aとなります。私は自分自身を明らかにした

希望=)

+0

ありがとうございます - 説明はとても便利です! – thelatemail

+0

@Andrew Logninov、2回以上繰り返されて表示される文字を置き換える場合は、これがどのように変化しますか?例えば、 '' rr''を '' r''に置き換えたいが、 '' rr''は変更しないでください。ありがとう。 – Nestorghh

+0

@Nestorghhどの言語を使用しているのかわかりませんが、一般的には、これはやや変形します。 'substitute( 'r {3、}'、 'r'、)'。 –

0

あなたが例えば、少なくとも3回(表示される文字を置き換える場合)、ここに私の解決策である(使用{2,}

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

することができますように4 "a"が1 aに減少し、3 rが1 rに縮小されていますが、2 nと2 eは変更されていません。 [a-zA-KM-Z]などの任意の組み合わせで指定し、コードをyとQの繰り返しのみに適用する場合は、かっこ[y | Q]内の "or"演算子を使用してください。

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

あなたは、少なくとものn回同じ文字の繰り返しを交換したい場合は、{n-1,}を使用しています。 そのn回の繰り返しを(たとえば)文字だけ交換する場合は、交換で"\\1\\1"を使用してください。

関連する問題