2014-11-02 12 views
5

Diciamo che ho un numero con uno schema ricorrente, cioè esiste una stringa di cifre che si ripetono per rendere il numero in questione. Ad esempio, tale numero potrebbe essere 1234123412341234, creato ripetendo le cifre 1234.
Quello che mi piacerebbe fare, è trovare il modello che si ripete per creare il numero. Pertanto, data 1234123412341234, vorrei calcolare 1234 (e forse 4, per indicare che 1234 si ripete 4 volte per creare 1234123412341234)Trovare il modello ricorrente

So che avrei potuto fare questo:

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) 

Tuttavia, questo sembra un po 'troppo hacky. Ho pensato che avrei potuto usare itertools.cycle per confrontare due cicli per l'uguaglianza, che in realtà non pan fuori:

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

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

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

C'è un modo migliore per calcolare questo? (Mi piacerebbe essere aperto a una regex, ma non ho idea di come applicarlo lì, che è il motivo per cui non ho incluso nel mio tentativi)

EDIT:

  1. I don è necessario sapere che il numero ha uno schema ripetitivo, quindi devo restituire None se non ce n'è uno.
  2. Al momento, mi preoccupo solo di rilevare numeri/stringhe composte interamente da un motivo ripetuto. Tuttavia, in seguito, io probabilmente anche essere interessati a trovare i modelli che iniziano dopo pochi caratteri:

magic_function (78961234123412341234)

sarebbero ritornati 1234 come il modello, come il 4 numero di volte che viene ripetuto, e 4 come il primo indice nell'input dove il modello si presenta prima

+0

E qualcosa come "771177117711"? È molto difficile. –

+0

@AlexThornton: Questo è uno schema di '7711', 3 volte, o un pattern di' 1177', due volte (con il rumore iniziale e finale) – inspectorG4dget

+0

L'espressione regolare fallisce per questo, fastidiosamente. Vedrò se riesco a pensare a qualcosa. –

risposta

5
(.+?)\1+ 

prova t il suo. Prendi la cattura. Vedi demo.

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

re.findall(p, test_str) 

Aggiungi ancore e bandiera Multiline se si desidera che la regex per fallire su 12341234123123, che dovrebbe tornare None.

^(.+?)\1+$ 

Vedere demo.

0

Un modo per trovare uno schema ricorrente e il numero di volte ripetuto è quello di utilizzare questo schema:

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

w/g opzione.
restituirà il modello ripetuto e il numero di partite (volte ripetuto)
modelli non ripetuto (fallisce) restituirà solo "" partita
schemi ripetuti torneranno 2 o più partite (numero di volte ripetuta).
Demo

+0

Sareste in grado di pubblicare un esempio del codice per trovare non corrispondenze, ecc.? – inspectorG4dget

+0

http://regex101.com/r/yW4aZ3/91, è stata trovata una sola partita –

Problemi correlati