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!