Обробка зворотних посилань для захоплення груп у шаблоні заміни re.sub


85

Я хочу взяти рядок 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

Відповіді:


115

Ви повинні використовувати необроблені рядки для регулярного виразу, спробуйте наступне:

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замінює його якимось химерним символом унікоду.
Черін

15

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

Використовуйте необроблені рядки, в яких Python не інтерпретує \.

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

Це висвітлено на початку reдокументації , якщо вам потрібна додаткова інформація.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.