Python Regex ersetzt sofort Gruppen

106

Gibt es eine Möglichkeit, alle Gruppen mithilfe der Regex-Syntax direkt zu ersetzen?

Der normale Weg:

re.match(r"(?:aaa)(_bbb)", string1).group(1)

Aber ich möchte so etwas erreichen:

re.match(r"(\d.*?)\s(\d.*?)", "(CALL_GROUP_1) (CALL_GROUP_2)")

Ich möchte die neue Zeichenfolge sofort aus den Gruppen erstellen, die der Regex gerade erfasst hat.

mc_kaiser
quelle

Antworten:

188

Schauen Sie sich an re.sub:

result = re.sub(r"(\d.*?)\s(\d.*?)", r"\1 \2", string1)

Dies ist die Regex-Ersetzungsfunktion (Ersetzen) von Python. Die Ersetzungszeichenfolge kann mit sogenannten Rückreferenzen (Backslash, Gruppennummer) gefüllt werden, die durch die von den Gruppen übereinstimmenden ersetzt werden. Gruppen werden genauso gezählt wie bei der group(...)Funktion, dh 1von links nach rechts durch Öffnen von Klammern.

Martin Ender
quelle
4
Viel klarer als der Doc! Ich habe nicht verstanden, wie die Gruppe mit diesem arbeitet. Sie sollten ein solches Beispiel hinzufügen.
Y0da
Es hat vom ersten Mal an funktioniert. Dies ist ein ziemlich guter klarer Weg, um es zu erklären. Vielen Dank und können Sie erklären, wie die Untergruppe in der richtigen (r(r))r((r)((r)r))Situation anrufen sollte ?
Rakshitha Muranga Rodrigo
1
@RakshithaMurangaRodrigo Die Gruppen sind von links nach rechts nummeriert, je nachdem, wo sie beginnen. Wenn ich also die Nummer jeder Gruppe direkt vor der Gruppe einfüge, werden sie sortiert : 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender
@ MartinEnder: Vielen Dank!
Rakshitha Muranga Rodrigo
30

Die akzeptierte Antwort ist perfekt. Ich würde hinzufügen, dass Gruppenreferenzen wahrscheinlich besser mit dieser Syntax erreicht werden:

r"\g<1> \g<2>"

für die Ersatzzeichenfolge. Auf diese Weise umgehen Sie Syntaxbeschränkungen, bei denen auf eine Gruppe möglicherweise eine Ziffer folgt. Auch dies ist alles im Dokument vorhanden, nichts Neues, nur manchmal auf den ersten Blick schwer zu erkennen.

Benelgiac
quelle