Encontrando el patrón recurrente.

Digamos que tengo un número con un patrón recurrente, es decir, existe una cadena de dígitos que se repiten para hacer el número en cuestión. Por ejemplo, tal número podría ser 1234123412341234 , creado repitiendo los dígitos 1234 .
Lo que me gustaría hacer es encontrar el patrón que se repite para crear el número. Por lo tanto, dado 1234123412341234 , me gustaría calcular 1234 (y tal vez 4 , para indicar que 1234 se repite 4 veces para crear 1234123412341234 )

Sé que podría hacer esto:

 def findPattern(num): num = str(num) for i in range(len(num)): patt = num[:i] if (len(num)/len(patt))%1: continue if pat*(len(num)//len(patt)): return patt, len(num)//len(patt) 

Sin embargo, esto parece un poco demasiado hacky. Pensé que podría usar itertools.cycle para comparar dos ciclos para la igualdad, lo que realmente no funciona:

 In [25]: c1 = itertools.cycle(list(range(4))) In [26]: c2 = itertools.cycle(list(range(4))) In [27]: c1==c2 Out[27]: False 

¿Hay una mejor manera de calcular esto? (Estaría abierto a una expresión regular, pero no tengo idea de cómo aplicarlo allí, por lo que no lo incluí en mis bashs)

EDITAR :

  1. No necesariamente sé que el número tenga un patrón de repetición, así que tengo que devolver None si no hay uno.
  2. En este momento, solo me preocupa detectar números / cadenas que se componen completamente de un patrón repetitivo. Sin embargo, más adelante, es probable que también me interese encontrar patrones que comiencen después de algunos caracteres:

magic_function (78961234123412341234)

devolvería 1234 como el patrón, 4 como el número de veces que se repite, y 4 como el primer índice en la entrada donde el patrón primero se presenta

 (.+?)\1+ 

Prueba esto. Coge la captura. Ver demo .

 import re p = re.compile(ur'(.+?)\1+') test_str = u"1234123412341234" re.findall(p, test_str) 

Agregue anclas y 12341234123123 Multiline si desea que la expresión regular falle en 12341234123123 , que debería devolver None .

 ^(.+?)\1+$ 

Ver demo .

Una forma de encontrar un patrón recurrente y el número de veces que se repite es usar este patrón:

 (.+?)(?=\1+$|$) 

Opción w / g .
Devolverá el patrón repetido y el número de coincidencias (tiempos repetidos)
Los patrones no repetidos (fallidos) devolverán solo la coincidencia ” 1
Los patrones repetidos devolverán 2 o más coincidencias (número de veces repetidas).
Manifestación