2012-01-31 18 views
23

Tengo un problema simple, pero no puede venir con una solución simple :)Detectar repeticiones en la cadena

Digamos que tengo una cadena. Quiero detectar si hay una repetición en él.

me gustaría:

"blablabla" # => (bla, 3) 

"rablabla" # => (bla, 2) 

Lo que pasa es que no sé qué patrón Estoy buscando (no tengo "bla" como entrada).

¿Alguna idea?

EDIT:
Al ver los comentarios, creo que debería precisa un poco más de lo que tengo en mente:

  • En una cadena, o bien hay un patrón que se repeted o no.
  • El patrón repetido puede ser de cualquier longitud.

Si hay un patrón, se repetirá una y otra vez hasta el final. Pero la cuerda puede terminar en el medio del patrón.

Ejemplo:

"testblblblblb" # => ("bl",4) 
+3

No suena como un problema muy simple para mí – Hubro

+14

Diría que 'rablabla' debería devolver' ('abl', 2) ', ¿no? –

+0

según su ejemplo, la secuencia repetida es de longitud 3. ¿Está buscando solo cadenas de longitud 3? – Jayy

Respuesta

39
import re 
def repetitions(s): 
    r = re.compile(r"(.+?)\1+") 
    for match in r.finditer(s): 
     yield (match.group(1), len(match.group(0))/len(match.group(1))) 

encuentra toda la no superposición de repetir partidos, utilizando la unidad más corta posible de la repetición:

>>> list(repetitions("blablabla")) 
[('bla', 3)] 
>>> list(repetitions("rablabla")) 
[('abl', 2)] 
>>> list(repetitions("aaaaa")) 
[('a', 5)] 
>>> list(repetitions("aaaaablablabla")) 
[('a', 5), ('bla', 3)] 
+1

yay soluciones regex! –

+0

o_O. ¡Definitivamente debería mirar eso! – jlengrand

+0

Iba a sugerir construir un gráfico, pero creo que esto hace lo mismo de manera más eficiente;) – Marcin

Cuestiones relacionadas