处理后向引用以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 2011年

1
这个特定的问题不需要正则表达式,请使用replace: coords.replace(' ', '')
Gringo Suave

Answers:


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/…可以更好地解释什么是原始字符串。
理查德

在上面的示例中,您将如何实际打印组名?说,如果group\1被称为xCoord,是否有可能指示re.sub将子字符串替换为组名称,从而re.sub(r"(\d), (\d)", r"\1,\2", coords)导致字符串字面量xCoord,52.25378
zelusp

这在Python3中不起作用。使用\1将其替换为一些奇怪的Unicode字符。
塞林

15

Python将解释\1为ASCII值为1的字符,并将其传递给sub

使用原始字符串,其中Python不解释\

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

如果需要更多信息,将在re文档开始处介绍

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.