Python Regex finde alle überlappenden Übereinstimmungen?

Ich versuche, jede 10-stellige Reihe von Zahlen innerhalb einer größeren Reihe von Zahlen mit re in Python 2.6 zu finden.

Ich bin leicht in der Lage, keine überlappenden Matches zu bekommen, aber ich möchte jedes Match in der Zahlenreihe. Z.B.

in “123456789123456789”

Ich sollte folgende Liste bekommen:

[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789] 

Ich habe Referenzen zu einem “Lookahead” gefunden, aber die Beispiele, die ich gesehen habe, zeigen nur Paare von Zahlen anstelle von größeren Gruppierungen und ich konnte sie nicht über die zwei Ziffern hinaus konvertieren.

Verwenden Sie eine einfangende Gruppe in einem Lookahead. Der Lookahead erfasst den Text, an dem Sie interessiert sind, aber die tatsächliche Übereinstimmung ist technisch die Null-breite Teilzeichenfolge vor dem Lookahead, sodass die Übereinstimmungen technisch nicht überlappend sind:

 import re s = "123456789123456789" matches = re.finditer(r'(?=(\d{10}))',s) results = [int(match.group(1)) for match in matches] # results: # [1234567891, # 2345678912, # 3456789123, # 4567891234, # 5678912345, # 6789123456, # 7891234567, # 8912345678, # 9123456789] 

Sie können auch das regex Modul eines Drittanbieters (nicht re ) verwenden, das überlappende Übereinstimmungen unterstützt.

 >>> import regex as re >>> s = "123456789123456789" >>> matches = re.findall(r'\d{10}', s, overlapped=True) >>> for match in matches: print match ... 1234567891 2345678912 3456789123 4567891234 5678912345 6789123456 7891234567 8912345678 9123456789 

Ich mag Regex, aber sie werden hier nicht benötigt.

Einfach

 s = "123456789123456789" n = 10 li = [ s[i:i+n] for i in xrange(len(s)-n+1) ] print '\n'.join(li) 

Ergebnis

 1234567891 2345678912 3456789123 4567891234 5678912345 6789123456 7891234567 8912345678 9123456789