Python Regex sostituisce istantaneamente i gruppi


106

C'è un modo per sostituire direttamente tutti i gruppi utilizzando la sintassi regex?

Il modo normale:

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

Ma voglio ottenere qualcosa del genere:

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

Voglio creare istantaneamente la nuova stringa dai gruppi che il Regex ha appena catturato.

Risposte:


189

Dai uno sguardo a re.sub:

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

Questa è la funzione di sostituzione (sostituzione) di regex di Python. La stringa di sostituzione può essere riempita con i cosiddetti backreferences (backslash, numero di gruppo) che vengono sostituiti con ciò che è stato trovato dai gruppi. I gruppi vengono contati allo stesso modo della group(...)funzione, cioè a partire da 1, da sinistra a destra, aprendo le parentesi.


4
Molto più chiaro del doc! Non capivo come il gruppo stesse lavorando con questo. Dovrebbero aggiungere tale esempio.
Y0da

ha funzionato dalla prima volta, questo è un modo abbastanza chiaro per spiegarlo. Grazie e puoi spiegare come il sottogruppo dovrebbe chiamare in modo corretto una (r(r))r((r)((r)r))situazione?
Rakshitha Muranga Rodrigo

1
@RakshithaMurangaRodrigo I gruppi sono numerati da sinistra a destra, andando da dove iniziano. Quindi, se inserisco di ogni gruppo di numero proprio di fronte al gruppo, sarebbero ordinati: 1(r2(r))r3(4(r)5(6(r)r)).
Martin Ender

@MartinEnder: Grazie mille!
Rakshitha Muranga Rodrigo

30

La risposta accettata è perfetta. Vorrei aggiungere che il riferimento al gruppo è probabilmente ottenuto meglio utilizzando questa sintassi:

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

per la stringa di sostituzione. In questo modo, aggiri i limiti di sintassi in cui un gruppo può essere seguito da una cifra. Di nuovo, questo è tutto presente nel documento, niente di nuovo, solo a volte difficile da individuare a prima vista.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.