2011-10-12 6 views
6

私のユーザーは、(私のユーザーについて私に尋ねるいけない!)形式の文書に正規表現で繰り返し文字を見つけることができますか?

________________________ 
************************ 
------------------------ 
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ 

様配列を挿入します。 スニペットを表示すると、ひどく見えます。どのように文字の繰り返しを取り除くことができますか?私は個々のフィルターを追加することができますが、それは一定の猫とマウスのゲームになります。

正規表現でこれらをフィルタできますか?

答えて

10

のようなものを試してみてください。あなたの言語が正規表現パターンのために文字列を使用するならば、\をエスケープすることを忘れないでください!

Pythonで
+2

+1、私は 'の代わりに' [^-ZA-Z0-9] '使用します.' –

5

あなたはしかし、これは、そのような彼らのスペルに手紙を倍増している言葉(バルーン綴り、としてだけでなく合法的な用途をキャッチします(.)\1+

のような単純な正規表現で任意の文字の繰り返しを削除することができますウェルなど)。

したがって、可能な限り一般的なままにしておいて、ユーザーが新しい文字を見つけたときには、時々修正する必要がないように、表現をいくつかの許可されていない文字に制限することをお勧めします使用する。
一つの可能​​な解決策は、繰り返し非文字・非数字文字を許可しないように次のようになります。

([^A-Za-z0-9])\1+

しかし、あなたのユーザーの一部が実際に決めることができるようにもこれは、すべての場合に決定的な解決策ではありません区切り文字として実際の文字列を使用します。

ZZZZZZZZZZZZZZZZZZZZZZ 
BBBBBBBBBBBBBBBBBBBBBB 
ZZZZZZZZZZZZZZZZZZZZZZ 

これを許可して(例えば省略記号のように:...)いくつかの繰り返し以外の文字の文字の正当な使用を可能にするという利点がありないようにするために、あなたは可能性があり文字の繰り返しを最大限に制限する正規表現を使用して、のように、(.)\1{4,}という文字列と一致するようにします。最短の長さは4で、最大値は不定です。任意の文字に一致し

(.)\1{5,} 

、その文字の後、5以上:

1

(しかし、ロジックは言語に関係なく同じです):これは、あなたには、いくつかの代わりに何の制御ではなく何を持っているという利点があり

>>> import re 
>>> text = ''' 
... This is some text 
... ________________________ 
... This some more 
... ♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ 
... Truly the last line 
... ''' 
>>> print re.sub(r'[_♥]{2,}', '', text) #this is the core (regexp) 

This is some text 

This some more 

Truly the last line 

(たとえば、あなたがいないことを望むかもしれませんそれはThis is still to do...のようなコメントの一部とすることができるよう.を代用

EDIT:

あなたの繰り返しは、常にあなたが改行cを追加することができ、「行」であればあなたの式にharacters:

text = ''' 
This is some text 
________________________ 
This some more 
♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥ 
Truly the last line 
But this is not to be changed: ♥♥♥ 
''' 
>>> print re.sub(r'\n[_♥]{2,}\n', '\n', text) 
This is some text 
This some more 
Truly the last line 
But this is not to be changed: ♥♥♥ 

HTH

関連する問題