2013-08-31 13 views
6

Avere una stringa qualsiasi, comeRicerca di sottostringhe ripetitivi

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

Posso in qualche modo trovare stringhe ripetitive delimitati da spazi (Edit)? In questo caso sarebbe "salve", "io sono" e "stringa".

Mi sono chiesto per un po 'di tempo ma non riesco ancora a trovare una soluzione reale. Ho letto anche alcuni articoli su questo argomento e ho trovato degli alberi di suffisso, ma questo può aiutarmi anche se ho bisogno di trovare ogni ripetizione, ad es. con un numero di ripetizioni superiore a due?

Se è così, c'è qualche libreria per Python, che può gestire gli alberi di suffisso ed eseguire operazioni su di essi?

Modifica: Mi dispiace non essere stato abbastanza chiaro. Quindi, per chiarire meglio: sto cercando sottostringhe ripetitive, cioè sequenze di stringhe, che, ad esempio, in termini di espressioni regolari possono essere sostituite da caratteri + o {}. Quindi, se avrei dovuto fare espressioni regolari da stringa quotata, lo farei

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

possibile duplicato del [Trova più lunga sequenza ripetitiva in una stringa] (http://stackoverflow.com/questions/11090289/find-longest-repetitive-sequence-in-a-string) – fsw

+0

Penso di sì. In realtà ho letto questa domanda prima di aver postato questo e non mi è venuta in mente alcuna idea su come convertire la soluzione in modo che fosse adatta al mio problema. – Jendas

+0

Vero, mi concentravo solo sull'output che volevo davvero. Mi dispiace per quello – Jendas

risposta

3

di trovare due o più caratteri che si ripetono due o più volte, ogni delimitato da spazi, l'uso:

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

Ecco un esempio funzionante con la stringa di test: http://bit.ly/17cKX62

EDIT: reso quantificatore nel gruppo di cattura riluttante aggiungendo? per abbinare occorrenza più breve possibile (cioè ora corrisponde "stringa" e non "string")

EDIT 2: aggiunto un delimitatore spazio necessario per ottenere risultati più puliti

+1

Funziona per il suo caso, ma farei il. {2,} non-goloso altrimenti corrisponderà "a a" in "a a a a b". – jaytea

+0

Giusto. Così com'è, sta facendo corrispondere "stringa stringa", non "stringa" –

+0

Wow, funziona come per magia! Poco prima di accettare la tua risposta, ti dispiacerebbe spiegare un po 'l'espressione regolare? Capisco perché abbiamo (. {2,}?), Ma la parentesi seguente? "?:" significa non ricordare, \ s + è abbastanza chiaro ma \ 1? Questo dice "Prendi ciò che hai trovato dal gruppo n.1 e lo trovi di nuovo? " – Jendas