2011-10-12 29 views
6

我的用戶接入像正則表達式可以找到重複的字符嗎?

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

以格式的文件序列(不要問我關於我的用戶!)。當顯示片段時,它看起來很糟糕。我如何刪除任何字符的重複?我可以添加個人過濾器,但它將是一個不斷的貓和老鼠遊戲。

正則表達式可以過濾這些嗎?

回答

10

嘗試類似:

(.)\1{5,} 

的任何字符,然後5個或更多該字符相匹配。如果你的語言使用正則表達式模式的字符串,請記住要逃避\ \!

+2

+1,但我會用'[A--ZA Z0-9 ^]'的',而不是.' –

5

可以消除任何一個字符的重複一個簡單的正則表達式像(.)\1+

然而,這將趕上合法用途爲好,如在他們的拼寫(氣球拼寫了一倍字母的單詞, 等)。

因此,您可能希望將表達式限制爲某些不允許的字符,畢竟儘可能保持通用,以便不必隨時對其進行修改,因爲用戶可以找到新字符使用。
一個可能的解決辦法是不允許重複的非字母和非數字字符:

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

但是,即使這不是一個徹底解決所有的情況下,如一些用戶可能實際上決定使用實際的字母序列作爲分隔符:

ZZZZZZZZZZZZZZZZZZZZZZ 
BBBBBBBBBBBBBBBBBBBBBB 
ZZZZZZZZZZZZZZZZZZZZZZ 

爲了不讓這一點,並允許一些重複的非字母字符合法用途(如省略號:...)的好處是,你可以將字符重複限制在最大限度通過使用正則表達式,其語法爲(<pattern>)\1{min, max},如下所示:(.)\1{4,}匹配違規字符序列,最小長度爲4,未指定最大值。

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...部分註釋

編輯:

如果重複始終爲「線」,你可以添加新行ç 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