2013-08-31 22 views
6

Mając jakiś dowolny ciąg taki jakZnalezienie powtarzające podciągi

hello hello hello I am I am I am your string string string string of strings 

Czy mogę jakoś znaleźć powtarzające podciągi rozdzielonych spacjami (Edycja)? W tym przypadku byłoby to "cześć", "jestem" i "ciąg".

zastanawiałem się o tym od jakiegoś czasu, ale nadal nie mogę znaleźć żadnego realnego rozwiązania. Przeczytałem również kilka artykułów dotyczących tego tematu i trafiłem na drzewa przyrostków, ale czy to mi pomoże, mimo że muszę znaleźć każde powtórzenie np. z powtarzalnością policzyć wyżej niż dwa?

Jeśli tak jest, to jest jakiś biblioteka dla Pythona, który może obsłużyć drzewo sufiksowe i wykonywać operacje na nich?

Edytuj: Przepraszam, nie byłem wystarczająco jasny. Aby to wyjaśnić - szukam powtarzających się pod-łańcuchów, co oznacza sekwencje w łańcuchu, które na przykład w wyrażeniach regularnych mogą być zastąpione przez + lub {} znaki wieloznaczne. Więc jeśli będę musiał zrobić wyrażenia regularnego z wymienionych ciąg, zrobiłbym

(hello){3}(I am){3}your (string){4}of strings 
+0

możliwe duplikat [Znajdź najdłuższą powtarzalną sekwencję w ciąg znaków] (http://stackoverflow.com/questions/11090289/find-longest-repetitive-sequence-in-a-string) – fsw

+0

Myślę, że tak. Właściwie to przeczytałem to pytanie, zanim opublikowałem to i nie wpadłem na pomysł, jak przekonwertować rozwiązanie, które będzie odpowiednie dla mojego problemu. – Jendas

+0

Prawda, skupiłem się tylko na tym, czego naprawdę chciałem. Przepraszam za to. – Jendas

Odpowiedz

3

Aby znaleźć dwa lub więcej znaków, które powtarzają dwa lub więcej razy, za każdym rozdzielany spacjami, zastosowanie:

(.{2,}?)(?:\s+\1)+ 

Oto przykład działania z twoim ciągiem testowym: http://bit.ly/17cKX62

EDYCJA: dokonano kwantyfikatora w grupie przechwytującej niechętnie przez dodanie? dopasować najkrótszy mecz (czyli teraz pasuje „ciąg”, a nie „ciąg znaków”)

EDIT 2: dodano wymaganą separator przestrzeni dla wyników czystszych

+1

Działa dla jego sprawy, ale zrobiłbym. {2,} nie-chciwą, w przeciwnym razie będzie pasować do "a" w "a a a b". – jaytea

+0

W prawo. Jak to jest, pasuje "ciąg ciąg", a nie "ciąg" –

+0

Wow, działa jak magia! Zanim zaakceptuję twoją odpowiedź, czy mógłbybyś wyjaśnić trochę wyrażenie regularne? Rozumiem, dlaczego mamy (. {2,}?), Ale następujący nawias? "?:" oznacza nie pamiętam, \ s + jest wystarczająco jasny, ale \ 1? Czy to powie: "Weź to, co znalazłeś z numeru grupy1 i znaleźć go ponownie? " – Jendas