Regulärer Ausdruck zur Erkennung von Wiederholungen innerhalb einer Zeichenfolge

8

Ist es möglich, wiederholte Zahlenmuster mit einem regulären Ausdruck zu erkennen?

Wenn ich zum Beispiel die folgende Zeichenfolge "034503450345" hätte, wäre es dann möglich, die wiederholte Sequenz 0345 anzupassen? Ich habe das Gefühl, dass dies den Rahmen der Regex sprengt, aber ich dachte, ich würde hier trotzdem fragen, ob ich etwas verpasst habe.

    
Mark Withers 03.06.2009, 09:45
quelle

5 Antworten

9

Ja, Sie können - hier ist ein Python-Testfall

%Vor%

Der reguläre Ausdruck sagt "finde eine Reihe von Ziffern, dann eine beliebige Menge anderer Sachen, dann die gleiche Sequenz wieder."

In einer kaum verwandten Anmerkung, hier ist einer meiner bevorzugten regulären Ausdrücke - ein Primzahl-Detektor:

%Vor%     
RichieHindle 03.06.2009, 09:49
quelle
19

Dieser Ausdruck entspricht einer oder mehreren sich wiederholenden Gruppen:

%Vor%


Hier ist der gleiche Ausdruck aufgegliedert (mithilfe von Kommentaren kann er immer noch direkt als Regex verwendet werden).

%Vor%


Um ein bestimmtes Muster anzupassen, ändern Sie .+ in dieses Muster, z. \d+ für eine oder mehrere Zahlen oder \d{4,} für 4 oder mehr Zahlen.

Um eine bestimmte Nummer des Musters zu erhalten, ändern Sie + , z. B. für vier Wiederholungen in {4} .

Damit die Wiederholung nicht nebeneinander liegt, können Sie .*? in den Lookahead einfügen.

    
Peter Boughton 03.06.2009 10:00
quelle
8

Nur um der (richtigen) Antwort von RichieHindle eine Notiz hinzuzufügen:

Beachten Sie, dass Pythons regexp-Implementierung (und viele andere, wie z. B. Perls) dies tun können, dies jedoch kein regulärer Ausdruck im engeren Sinne mehr ist.

Ihr Beispiel ist keine reguläre Sprache und kann daher nicht mit einem reinen regulären Ausdruck behandelt werden. Siehe z.B. der hervorragende Wikipedia-Artikel für Details.

Obwohl dies meist nur von akademischem Interesse ist, gibt es einige praktische Konsequenzen. Echte reguläre Ausdrücke können viel bessere Garantien für maximale Laufzeiten bieten als in diesem Fall. So könnten Sie irgendwann Leistungsprobleme bekommen.

Um nicht zu sagen, dass es keine gute Lösung ist, aber Sie sollten erkennen, dass Sie an der Grenze dessen stehen, was reguläre Ausdrücke (auch in erweiterter Form) können, und im Fall von Problemen andere Lösungen in Betracht ziehen möchten.

    
sleske 03.06.2009 10:12
quelle
2

Dies ist der C # -Code, der das Backreference-Konstrukt verwendet, um wiederholte Ziffern zu finden. Es funktioniert mit 034503450345, 123034503450345, 034503450345345, 232034503450345423. Die Regex ist viel einfacher und klarer zu verstehen.

%Vor%     
Rashmi Pandit 03.06.2009 10:17
quelle
0

Benutze Regex-Wiederholung:    Balken {2,} Sucht nach Text mit zwei oder mehr Balken:    Barbar    Barbarbar    ...

    
user1920925 13.01.2013 17:22
quelle

Tags und Links