[Gelöst] Frage zu non-overlapping matches.
Verfasst: Montag 12. Februar 2007, 20:38
Vorweg:finditer( pattern, string[, flags])
Return an iterator over all non-overlapping matches for the RE pattern in string. For each match, the iterator returns a match object. Empty matches are included in the result unless they touch the beginning of another match. New in version 2.2. Changed in version 2.4: Added the optional flags argument.
Wie ist es eigentlich mit der Reihenfolge der Auswertung von regex?
Beispiel 1: http://paste.pocoo.org/show/960/
Soweit Ok. (?P<_1>\*\*) greift vor (?P<_2>\*)
Ausgabe:
Code: Alles auswählen
[('_1', '**')]
[('_1', '**')]
[('_2', '*')]
[('_2', '*')]
Vertausche ich die Reihenfolge kommt wie erwarte folgendes, da ** nie erkannt werden kann, weil * davor liegt.
Code: Alles auswählen
[('_2', '*')]
[('_2', '*')]
[('_2', '*')]
[('_2', '*')]
[('_2', '*')]
[('_2', '*')]
Um so verblüffender folgendes, das cih nicht verstehen kann. Und da kommt nun non-overlapping in Spiel, falls ich das richtig verstehe.
Beispiel 3: http://paste.pocoo.org/show/962/
Wie erwartet folgende Ausgabe:
Code: Alles auswählen
[('linebreak', '\n')]
[('command', '#link'), ('arg', 'wwwt.test.de')]
[('linebreak', '\n')]
[('bold', '**')]
[('bold', '**')]
[('linebreak', '\n')]
[('linebreak', '\n')]
Folgende Ausgab hätte ich nicht erwartet und verstehe nicht, warum sich re da nicht an die Reihenfolge hält?!
Code: Alles auswählen
[('linebreak', '\n')]
[('literal', ' #link[wwwt.test.de]')]
[('linebreak', '\n')]
[('literal', ' test...! **test**')]
[('linebreak', '\n')]
[('literal', ' blubb')]
[('linebreak', '\n')]
[('literal', ' ')]
Weiß einer eine Antwort und ein Rat? -- Ich möchte nun ungern mit ``span``, Positionspeicherungen und Indexzugriffen arbeiten um literale rauszufischen. Das ist sehr fehleranfällig und macht den Code nur unnötig kompliziert.
lg