Обработка групп захвата в re.sub?

Я хочу взять строку 0.71331, 52.25378 и вернуть 0.71331,52.25378 - т.е. просто найти цифру, запятую, пробел и цифру и вычеркнуть пробел.

Это мой текущий код:

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

Но это дает мне 0.7133,2.25378. Что я делаю не так?

Ответ 1

Вы должны использовать необработанные строки для регулярного выражения, попробуйте следующее:

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

С вашим текущим кодом обратная косая черта в вашей заменяющей строке ускользает от цифр, поэтому вы заменяете все соответствия эквивалентом chr(1) + "," + chr(2):

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

Каждый раз, когда вы хотите оставить обратную косую черту в строке, используйте префикс r или выйдите из каждой обратной косой черты (\\1,\\2).

Ответ 2

Python интерпретирует \1 как символ с ASCII значением 1 и передает его на sub.

Используйте необработанные строки, в которых Python не интерпретирует \.

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

Это предусмотрено в самом начале re документации, если вам нужно больше информации.