Lidando com referências anteriores para capturar grupos no padrão de substituição re.sub

88

Quero pegar a string 0.71331, 52.25378e retornar 0.71331,52.25378- ou seja, basta procurar um dígito, uma vírgula, um espaço e um dígito e retirar o espaço.

Este é meu código atual:

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

Mas isso me dá 0.7133,2.25378. O que estou fazendo errado?

Richard
fonte
4
Desde que você realmente não quer capturar os dígitos, pode fazer mais sentido usar look-around, ou seja: re.sub(r'(?<=\d), (?=\d)', ',', coords).
ig0774
1
Esta questão em particular não precisa de regex, use substituir: coords.replace(' ', '')
Gringo Suave

Respostas:

120

Você deve usar strings brutas para regex, tente o seguinte:

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

Com seu código atual, as barras invertidas em sua string de substituição estão escapando aos dígitos, então você está substituindo todas as correspondências pelo equivalente a chr(1) + "," + chr(2):

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

Sempre que quiser deixar a barra invertida na string, use o rprefixo ou escape de cada barra invertida ( \\1,\\2).

Andrew Clark
fonte
2
Obrigado, isso fez o truque. docs.python.org/library/re.html#raw-string-notation para quem está lendo isso.
Richard
1
Também stackoverflow.com/questions/2081640/… para uma melhor explicação do que são strings brutas.
Richard
Como você realmente imprimiria o nome do grupo no exemplo acima? Digamos, se o grupo foi \1chamado xCoord , é possível instruir re.subpara substituir as sub strings por nomes de grupo de forma que re.sub(r"(\d), (\d)", r"\1,\2", coords)resultou na string literalxCoord,52.25378
zelusp
Isso não funciona no Python3. Usando o \1substitui por algum caractere Unicode bizarro.
Cerin
16

Python interpreta o \1como um caractere com valor ASCII 1 e o passa para sub.

Use strings brutas, nas quais o Python não interpreta o \.

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

Isso é abordado logo no início da redocumentação , caso você precise de mais informações.

Petr Viktorin
fonte