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.