Regular Expressions und positive look-ahead

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Antworten
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

der Sinn von negative look-aheads in Regexes ist mir völlig klar und sie sind auch richtig praktisch. Allerdings erschließt sich mir nicht der Sinn von positive look-aheads. Für was braucht man die? Könnte mir da jemand auf die Sprünge helfen?

Danke schonmal.

Gruß,
Manuel
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Wenn du ein Wort nur dann finden möchtest, wenn es vor einem anderen steht, ist ein positiver look-ahead notwendig. Das ist ein Fall, den ich mir durchaus vorstellen kann.

Sagen wir z.B. in einem Text möchtest du Eurobeträge finden und fett schreiben - das Euro-Zeichen, das dem Betrag folgt, jedoch nicht.

Stefan
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,
sma hat geschrieben:Sagen wir z.B. in einem Text möchtest du Eurobeträge finden und fett schreiben - das Euro-Zeichen, das dem Betrag folgt, jedoch nicht.
ah, ok, jetzt verstehe ich's. Das macht nur bei substitutes Sinn. Bei bloßen matches und searches ist er aber ein Klotz am Bein. An substitutes habe ich gar nicht gedacht. :oops:

Danke!

Gruß,
Manuel
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dann könnte man aber auch Gruppen bilden etwa ``(\d+) €`` und bei Substitutionen nur die gewünschten Gruppen verwenden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Leonidas hat geschrieben:Dann könnte man aber auch Gruppen bilden etwa ``(\d+) €`` und bei Substitutionen nur die gewünschten Gruppen verwenden.
Wie meinst du das?

Code: Alles auswählen

import re
t = "foo 12€ bar 14€ baz 15$"

print re.sub('(\d+)(?=€)', r'<b>\1</b>', t)
# foo <b>12</b>€ bar <b>14</b>€ baz 15$

print re.sub('(\d+)€', r'<b>\1</b>', t)
# foo <b>12</b> bar <b>14</b> baz 15$
Im ersten Beispiel werden nur die Beträge vor dem Euro-Zeichen fett geschrieben. Das Euro-Zeichen selbst bleibt unangetastet.

Im zweiten Beispiel werden zwar auch nur die Beträge vor dem Euro-Zeichen fett geschrieben, allerdings geht das Euro-Zeichen verloren, wenn man es nicht wieder dran pappt. Spätestens, wenn ich mehrere Währungssymbole zulasse, muss ich im zweiten Beispiel eine zweite Gruppe erstellen und diese beim Ersetzen wieder dran pappen. Das ist etwas umständlich.

Man ist hier mit einem positive look-ahead besser dran, was den Ausdruck angeht (zumindest IMO). look-aheads sind allerdings langsamer.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

helduel hat geschrieben:Im zweiten Beispiel werden zwar auch nur die Beträge vor dem Euro-Zeichen fett geschrieben, allerdings geht das Euro-Zeichen verloren, wenn man es nicht wieder dran pappt. Spätestens, wenn ich mehrere Währungssymbole zulasse, muss ich im zweiten Beispiel eine zweite Gruppe erstellen und diese beim Ersetzen wieder dran pappen. Das ist etwas umständlich.
Also ich finde es nicht wirklich viel umständlicher:

Code: Alles auswählen

print re.sub('(\d+)(€)', r'<b>\1</b>\2', t)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Leonidas hat geschrieben:Also ich finde es nicht wirklich viel umständlicher:

Code: Alles auswählen

print re.sub('(\d+)(€)', r'<b>\1</b>\2', t)
*Viel* umständlicher natürlich nicht. ;-)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ein besserer Anwendungsfall für den Lookahead wäre wohl, wenn man in einem String "foofoofoofoobar" alle "foo", denen ein "foo" folgt - also für alle außer dem letzten - etwas machen möchte. Da funktioniert der Gruppierungstrick nicht mehr.

Stefan
Antworten