Gestire i riferimenti a ritroso per acquisire i gruppi nel modello di sostituzione re.sub


88

Voglio prendere la stringa 0.71331, 52.25378e restituire 0.71331,52.25378, cioè cercare una cifra, una virgola, uno spazio e una cifra e rimuovere lo spazio.

Questo è il mio codice attuale:

coords = '0.71331, 52.25378'
coord_re = re.sub("(\d), (\d)", "\1,\2", coords)
print coord_re

Ma questo mi dà 0.7133,2.25378. Che cosa sto facendo di sbagliato?


4
Dal momento che in realtà non vuole catturare le cifre, potrebbe avere più senso utilizzare look-around, vale a dire: re.sub(r'(?<=\d), (?=\d)', ',', coords).
ig0774

1
Questa particolare domanda non necessita di regex, usa sostituisci: coords.replace(' ', '')
Gringo Suave

Risposte:


120

Dovresti usare stringhe grezze per regex, prova quanto segue:

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

Con il codice corrente, le barre rovesciate nella stringa di sostituzione sfuggono alle cifre, quindi stai sostituendo tutte le corrispondenze l'equivalente di chr(1) + "," + chr(2):

>>> '\1,\2'
'\x01,\x02'
>>> print '\1,\2'
,
>>> print r'\1,\2'   # this is what you actually want
\1,\2

Ogni volta che vuoi lasciare la barra rovesciata nella stringa, usa il rprefisso o evita ogni barra rovesciata ( \\1,\\2).


2
Grazie, ha funzionato. docs.python.org/library/re.html#raw-string-notation per chiunque legga questo.
Richard

1
Anche stackoverflow.com/questions/2081640/… per una migliore spiegazione di cosa sono le stringhe grezze.
Richard

Come stamperesti effettivamente il nome del gruppo nell'esempio sopra? Diciamo, se il gruppo è \1chiamato xCoord , è possibile istruire re.suba sostituire le sottostringhe con nomi di gruppo tali che re.sub(r"(\d), (\d)", r"\1,\2", coords)risultassero nella stringa letteralexCoord,52.25378
zelusp

Questo non funziona in Python3. L'utilizzo lo \1sostituisce con un bizzarro personaggio Unicode.
Cerin

16

Python interpreta il \1come un carattere con valore ASCII 1 e lo passa a sub.

Usa stringhe grezze, in cui Python non interpreta il file \.

coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)

Questo è trattato all'inizio della redocumentazione , se hai bisogno di maggiori informazioni.

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.