2011-10-12 12 views
6

Moi użytkownicy wstawić sekwencje jakCzy wyrazy regularne mogą znaleźć powtórzenia znaków?

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

do dokumentów wielkoformatowych (nie pytaj mnie o moich użytkowników!). I wygląda źle podczas wyświetlania snippets. Jak mogę usunąć powtórzenia dowolnych znaków? Mogę dodawać pojedyncze filtry, ale będzie to stała gra w kotka i myszkę.

Czy można użyć filtru wyrażeń regularnych?

Odpowiedz

10

spróbować czegoś jak:

(.)\1{5,} 

który dopasowuje dowolny znak, następnie 5 lub więcej z tego znaku. Pamiętaj, aby uciec przed \, jeśli twój język używa ciągów dla wzorów regex!

+2

+1, ale użyłby '[^ a-zA-Z0-9]' zamiast '.' –

5

Można usunąć powtórzeń dowolnego znaku z prostych regex jak (.)\1+

Jednak to złapie legalnych zastosowań, jak również, takie jak słowa, które dwukrotnie litery w ich pisowni (balonu, pisownia, oraz itd.).

Więc, prawdopodobnie, chciałbyś ograniczyć wyrażenie do niektórych niedozwolonych znaków, zachowując je jak najbardziej ogólne, aby nie modyfikować go od czasu do czasu, ponieważ Twoi użytkownicy znajdują nowe znaki używać.
Możliwym rozwiązaniem byłoby zabronić powtarzane bez nas i nie-numeryczne znaki:

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

Ale nawet to nie jest ostateczne rozwiązanie wszystkich spraw, jak niektórzy użytkownicy mogą rzeczywiście decydują się korzystania z rzeczywistych sekwencji nas jako ograniczniki:

ZZZZZZZZZZZZZZZZZZZZZZ 
BBBBBBBBBBBBBBBBBBBBBB 
ZZZZZZZZZZZZZZZZZZZZZZ 

aby nie dopuścić do tego i z dodatkową korzyścią umożliwienia zgodnego z prawem wykorzystywania pewnych powtarzających się znaków non-literowych (tak jak w wielokropkiem: ...), można ograniczyć powtórzenia znaków do maksimum 3, za pomocą wyrażenia regularnego o składni (<pattern>)\1{min, max} w następujący sposób: (.)\1{4,}, aby dopasować nieprawidłowe sekwencje znaków, o minimalnej długości 4 i nieokreślonym maksimum.

1

W python (ale logika jest taka sama, niezależnie od języka):

>>> 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 

Ma to tę zaletę, że masz pewną kontrolę na tym, co do zastąpienia, a co nie (na przykład może nie życzyć zastąpić . jak mogłoby być częścią komentarzu jak This is still to do...

EDIT:.

Jeśli powtórzenia są zawsze „linii” można dodać do nowej linii c haracters do swojej wypowiedzi:

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

Powiązane problemy