2014-11-02 15 views
5

Załóżmy, że mam numer z powtarzającym się wzorcem, tj. Istnieje ciąg cyfr, które powtarzają się w celu utworzenia danego numeru. Na przykład taka liczba może być 1234123412341234, utworzona przez powtarzanie cyfr 1234.
Co chciałbym zrobić, to znaleźć wzór, który powtarza się, aby utworzyć numer. Dlatego też, biorąc pod uwagę 1234123412341234 chciałbym obliczyć 1234 (a może 4, aby wskazać, że 1234 powtarza się 4 razy, aby utworzyć 1234123412341234)Wyszukiwanie powtarzającego się wzoru

wiem, że mogę to zrobić:

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) 

to jednak wydaje się trochę zbyt odurzający. Pomyślałem mogę użyć itertools.cycle porównać dwa cykle dla równości, które tak naprawdę nie ułoży:

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

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

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

Czy istnieje lepszy sposób na obliczenie tego? (Będę otwarty na regex, ale nie mam pojęcia jak ją stosować tam, dlatego, że nie obejmują go w moich próbach)

EDIT:

  1. I don nie musisz wiedzieć, że liczba ma powtarzający się wzór, więc muszę zwrócić None, jeśli jej nie ma.
  2. Obecnie skupiam się wyłącznie na wykrywaniu liczb/ciągów, które składają się w całości z powtarzającego się wzoru. Jednak później, będę prawdopodobnie być także zainteresowany w znalezieniu wzorów, które rozpoczynają się po kilku znaków:

magic_function (78961234123412341234)

wróci 1234 jako wzór, jak 4 ile razy powtarza się, a 4 jako pierwszy indeks na wejściu gdzie wzór pierwszy prezentuje się

+0

Co na przykład z '771177117711'? To bardzo trudne. –

+0

@AlexThornton: Jest to wzorzec '7711', 3 razy lub wzorzec' 1177', dwa razy (z początkowym i końcowym szumem) – inspectorG4dget

+0

Wyrażenie regularne zawodzi, irytująco. Zobaczę, czy coś wymyślę. –

Odpowiedz

5
(.+?)\1+ 

Spróbuj t jego. Chwyć przechwytywanie. Zobacz demo.

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

re.findall(p, test_str) 

Dodaj kotwice i flagę Multiline jeśli chcesz regex niepowodzenie na 12341234123123, które powinny powrócić None.

^(.+?)\1+$ 

Zobacz demo.

0

Jednym ze sposobów, aby znaleźć powtarzające wzór i wielokrotnie powtarzanych jest korzystać z tego wzoru:/g opcji

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

wag.
To powoduje powrót powtarzane i liczbę pasujących (powtórzony)
Każdy powtarzany wzorów (nie) powróci tylko „” dopasowaniu
powtarzające się wzory powróci 2 lub więcej spotkania (kilka razy powtarzający się).
Demo

+0

Czy mógłbyś podać przykład twojego kodu znajdującego niezgodne, itp? – inspectorG4dget

+0

http://regex101.com/r/yW4aZ3/91, znaleziono tylko jeden mecz –