2014-11-02 7 views
5

Nehmen wir an, ich habe eine Nummer mit einem wiederkehrenden Muster, d. H. Es gibt eine Reihe von Ziffern, die sich wiederholen, um die betreffende Zahl zu bilden. Zum Beispiel könnte eine solche Nummer 1234123412341234 sein, die durch Wiederholen der Ziffern 1234 erzeugt wird.
Was ich tun möchte, ist das Muster zu finden, das sich wiederholt, um die Zahl zu erstellen. Daher gegeben 1234123412341234, würde Ich mag 1234 zu berechnen (und vielleicht 4, um anzuzeigen, dass 1234 4-mal wiederholt 1234123412341234 erstellen)Das wiederkehrende Muster finden

weiß ich, dass ich dies tun könnte:

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) 

jedoch diese scheint ein wenig zu hacky. Ich dachte, ich itertools.cycle nutzen könnte zwei Zyklen für die Gleichstellung zu vergleichen, die nicht wirklich pan out:

In [25]: c1 = itertools.cycle(list(range(4))) 

In [26]: c2 = itertools.cycle(list(range(4))) 

In [27]: c1==c2 
Out[27]: False 

Gibt es einen besseren Weg, dies zu berechnen? (Ich wäre offen für einen regex, aber ich habe keine Ahnung, wie es dort anzuwenden, weshalb ich es nicht in meinen Versuchen enthalten)

EDIT:

  1. I don Muss nicht wissen, dass die Nummer ein sich wiederholendes Muster hat, also muss ich None zurückgeben, wenn es keins gibt.
  2. Im Moment geht es mir nur darum, Nummern/Strings zu erkennen, die komplett aus einem sich wiederholenden Muster bestehen. Doch später, werde ich wahrscheinlich auch daran interessiert sein Muster zu finden, die nach ein paar Zeichen beginnen:

magic_function (78961234123412341234)

1234 als Muster zurückkommen würde, 4 als die Anzahl, wie oft sie wiederholt und 4 als der erste Index in dem Eingang, wo das Muster selbst erste

+0

Was ist mit etwas wie '771177117711'? Das ist sehr schwierig. –

+0

@AlexThornton: Das ist ein Muster von '7711', 3-mal, oder ein Muster von' 1177', zweimal (mit Vor- und Nachlaufgeräuschen) – inspectorG4dget

+0

Der reguläre Ausdruck scheitert daran, ärgerlich. Ich werde sehen, ob ich an etwas denken kann. –

Antwort

5
(.+?)\1+ 

Versuchen präsentiert t seine. Schnapp dir die Aufnahme. Siehe demo.

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

re.findall(p, test_str) 

hinzufügen Anker und Flagge Multiline, wenn Sie die Regex scheitern auf 12341234123123 wollen, die None zurückkehren.

^(.+?)\1+$ 

Siehe demo.

0

Eine Möglichkeit, ein wiederkehrendes Muster und mehrere Male wiederholt zu finden, ist dieses Muster zu verwenden:

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

w/g Option.
Es wird die wiederholten Muster und die Anzahl der Spiele (mal wiederholt)
Nicht wiederholende Muster (nicht) nur zurück „“ match
Wiederholte Muster kehrt zurück 2 oder mehr Matches (Anzahl der Zeiten wiederholt).
Demo

+0

Würdest du in der Lage sein, ein Beispiel für deinen Code zu finden, der nicht passt? – inspectorG4dget

+0

http://regex101.com/r/yW4aZ3/91, nur ein Treffer gefunden –