Manejo de las referencias a los grupos de captura en el patrón de reemplazo re.sub

Quiero tomar la cadena 0.71331, 52.25378 y devolver 0.71331,52.25378 , es decir, buscar un dígito, una coma, un espacio y un dígito, y eliminar el espacio.

Este es mi código actual:

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

Pero esto me da 0.7133,2.25378 . ¿Qué estoy haciendo mal?

Debería usar cadenas sin procesar para expresiones regulares, intente lo siguiente:

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

Con su código actual, las barras invertidas en su cadena de reemplazo están escapando de los dígitos, por lo que está reemplazando todas las coincidencias con el equivalente de chr(1) + "," + chr(2) :

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

Cada vez que quiera dejar la barra diagonal inversa en la cadena, use el prefijo r , o escape cada barra diagonal inversa ( \\1,\\2 ).

Python interpreta el \1 como un carácter con un valor ASCII 1, y lo pasa a sub .

Use cadenas en bruto, en las que Python no interpreta el \ .

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

Esto está cubierto justo al comienzo de la re documentación , en caso de que necesite más información.