Seite 1 von 1

Regular Expressions und positive look-ahead

Verfasst: Dienstag 1. April 2008, 11:34
von helduel
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

Verfasst: Donnerstag 3. April 2008, 07:26
von sma
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

Verfasst: Donnerstag 3. April 2008, 08:54
von helduel
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

Verfasst: Donnerstag 3. April 2008, 14:11
von Leonidas
Dann könnte man aber auch Gruppen bilden etwa ``(\d+) €`` und bei Substitutionen nur die gewünschten Gruppen verwenden.

Verfasst: Donnerstag 3. April 2008, 14:39
von helduel
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.

Verfasst: Donnerstag 3. April 2008, 15:54
von Leonidas
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)

Verfasst: Donnerstag 3. April 2008, 16:39
von helduel
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. ;-)

Verfasst: Samstag 5. April 2008, 08:29
von sma
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