Comencemos desde el final, cuente la frecuencia y deténgase tan pronto como aparezca el elemento más frecuente 3 o más veces.
from collections import Counter
a='fdwaw4helloworldvcdv1c3xcv3xcz1sda21f2sd1ahelloworldgafgfa4564534321fadghelloworld'
times=3
for n in range(1,len(a)/times+1)[::-1]:
substrings=[a[i:i+n] for i in range(len(a)-n+1)]
freqs=Counter(substrings)
if freqs.most_common(1)[0][1]>=3:
seq=freqs.most_common(1)[0][0]
break
print "sequence '%s' of length %s occurs %s or more times"%(seq,n,times)
Resultado:
>>> sequence 'helloworld' of length 10 occurs 3 or more times
Editar: si usted tiene la sensación de que está tratando con la entrada al azar y la subcadena común debe ser de pequeña longitud, es mejor empezar (si es necesario la velocidad) con pequeñas subseries y parar cuando no se puede encontrar ninguna que aparecen al menos 3 veces:
from collections import Counter
a='fdwaw4helloworldvcdv1c3xcv3xcz1sda21f2sd1ahelloworldgafgfa4564534321fadghelloworld'
times=3
for n in range(1,len(a)/times+1):
substrings=[a[i:i+n] for i in range(len(a)-n+1)]
freqs=Counter(substrings)
if freqs.most_common(1)[0][1]<3:
n-=1
break
else:
seq=freqs.most_common(1)[0][0]
print "sequence '%s' of length %s occurs %s or more times"%(seq,n,times)
el mismo resultado anterior.
No sé si hay una solución de expresiones regulares para este problema. Esta _puede ser una expresión regular, pero python podría tener una extensión no regular que hace algo como esto. En el caso general, este es el problema de LCS, que se puede resolver usando la programación dinámica: http://en.wikipedia.org/wiki/Longest_common_subsequence_problem –