Ich versuche, alle 10-stelligen Zahlenreihen innerhalb einer größeren Zahlenreihe mit re in Python 2.6 zu finden.
Ich bin leicht in der Lage, keine überlappenden Übereinstimmungen zu erfassen, aber ich möchte jede Übereinstimmung in der Zahlenserie. Z.B.
in "123456789123456789"
Ich sollte die folgende Liste bekommen:
[1234567891,2345678912,3456789123,4567891234,5678912345,6789123456,7891234567,8912345678,9123456789]
Ich habe Verweise auf einen "Lookahead" gefunden, aber die Beispiele, die ich gesehen habe, zeigen nur Zahlenpaare und keine größeren Gruppierungen, und ich konnte sie nicht über die beiden Ziffern hinaus konvertieren.
python
regex
overlapping
Hosen
quelle
quelle
(a|ab|abc)
können im Allgemeinen als nicht überlappende Regexe mit verschachtelten Capture-Gruppen umgeschrieben werden, z. B.(a(b(c)?)?)?
wenn wir beim Auspacken eines Matches alle außer der äußersten (dh ganz links) Capture-Gruppe ignorieren. zugegebenermaßen ist dies leicht schmerzhaft und weniger lesbar. Dies wird auch ein leistungsfähigerer Regex sein.Antworten:
Verwenden Sie eine Erfassungsgruppe in einem Lookahead. Der Lookahead erfasst den Text, an dem Sie interessiert sind, aber die tatsächliche Übereinstimmung ist technisch gesehen die Teilzeichenfolge mit der Breite Null vor dem Lookahead, sodass sich die Übereinstimmungen technisch nicht überlappen:
quelle
Sie können auch versuchen, das Drittanbieter-
regex
Modul (nichtre
) zu verwenden, das überlappende Übereinstimmungen unterstützt.quelle
Ich mag Regexe, aber sie werden hier nicht benötigt.
Einfach
Ergebnis
quelle
0 <= i < len(s)-n+1
garantiert der Beginn einer 10-stelligen Übereinstimmung ist. Ich denke auch, dass Ihr Code beschleunigt werden könnte, wäre interessant, Code-Golf für Geschwindigkeit.