Seite 1 von 1
regex und greedy
Verfasst: Mittwoch 2. September 2020, 13:17
von mleopold
Hallo zusammen,
ich möchte die ersten gleichen Zeichen eines string ersetzen. Der Code ist der folgende:
Code: Alles auswählen
import re
print(re.sub('^(@+)', '+'*len(r'\1'), '@@@@@abc'))
Ich würde nun als Ergebnis
+++++abc erwarten. Begründung: Das
+ ist greedy und sollte darum alle
@ am Anfang des strings "abfassen".
Tatsächlich kommt aber (unter python 3.7.3)
++abc heraus. Woran liegt das?
Danke schon mal
Re: regex und greedy
Verfasst: Mittwoch 2. September 2020, 13:24
von mleopold
Denkfehler. Man muss es einmal richtig hinschreiben. len(r'\1') ist 2 weil \ und 1.
Wie muss es richtig heißen?
Re: regex und greedy
Verfasst: Mittwoch 2. September 2020, 13:25
von snafu
Der Raw-String r"\1" besteht nun mal aus zwei Zeichen. Es ist aber schon klar, dass du die Gruppe referenzieren willst. Das geht aber nur innerhalb des Regex-Patterns. len() weiß nichts von regulären Ausdrücken, und schon gar nicht werden irgendwelche Abfragen für andere Funktionen zwischengespeichert...
Re: regex und greedy
Verfasst: Mittwoch 2. September 2020, 13:30
von mleopold
Danke. Da war ich brettig. Habe es nun zerlegt.
Re: regex und greedy
Verfasst: Mittwoch 2. September 2020, 13:50
von __blackjack__
Man kann `re.sub()` auch eine Funktion als zweites Argument übergeben die das Match-Objekt als Argument bekommt:
Code: Alles auswählen
In [157]: re.sub("^(@+)", lambda match: "+" * len(match.group(1)), "@@@@@abc")
Out[157]: '+++++abc'
Re: regex und greedy
Verfasst: Donnerstag 3. September 2020, 08:43
von mleopold
Ein sehr guter Hinweis, Danke!