Обработка обратных ссылок на группы захвата в шаблоне замены re.sub

86

Я хочу взять строку 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. Что я делаю не так?

Ричард
источник
4
Так как вы на самом деле не хотите , чтобы захватить цифры, это может сделать больше смысла использовать просмотровый обходные, то есть: re.sub(r'(?<=\d), (?=\d)', ',', coords).
ig0774
1
Этот конкретный вопрос не требует регулярного выражения, используйте замену: coords.replace(' ', '')
Gringo Suave

Ответы:

116

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

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
Спасибо, это сработало. docs.python.org/library/re.html#raw-string-notation для всех, кто это читает.
Ричард
1
Также stackoverflow.com/questions/2081640/… для лучшего объяснения того, что такое необработанные строки.
Ричард
Как бы вы на самом деле напечатали имя группы в приведенном выше примере? Скажем, если группа \1называется xCoord , можно ли дать указание re.subзаменить подстроки на имена групп таким образом, чтобы re.sub(r"(\d), (\d)", r"\1,\2", coords)xCoord,52.25378
получился
Это не работает в Python3. Использование \1заменяет его каким-то странным символом Юникода.
Cerin
15

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

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

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

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

Петр Викторин
источник