Quiero tomar la cadena 0.71331, 52.25378
y regresar 0.71331,52.25378
, es decir, solo 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?
re.sub(r'(?<=\d), (?=\d)', ',', coords)
.coords.replace(' ', '')
Respuestas:
Debería utilizar cadenas sin formato 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 se escapan de los dígitos, por lo que está reemplazando todas las coincidencias por 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
Siempre que desee dejar la barra invertida en la cadena, use el
r
prefijo o escape cada barra invertida (\\1,\\2
).fuente
\1
llamó xCoord , ¿es posible indicarre.sub
que se reemplacen las subcadenas con nombres de grupo quere.sub(r"(\d), (\d)", r"\1,\2", coords)
xCoord,52.25378
\1
reemplaza con algún extraño carácter Unicode.Python interpreta
\1
como un carácter con valor ASCII 1 y se lo pasa asub
.Utilice cadenas sin formato, en las que Python no interpreta el
\
.coord_re = re.sub(r"(\d), (\d)", r"\1,\2", coords)
Esto se cubre desde el principio de la
re
documentación , en caso de que necesite más información.fuente