在re.sub替换模式中处理捕获组的反向引用

142
我想把字符串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,我做错了什么?


6
既然您实际上不想捕获数字,那么使用正向零宽断言可能更合理,即:re.sub(r'(?<=\d), (?=\d)', ',', coords) - ig0774
6
这个问题不需要正则表达式,可以使用替换功能:coords.replace(' ', '')。将空格替换为空即可。 - Gringo Suave
@GringoSuave 问题不是要替换/消除所有的空格。只有当空格位于(数字)(逗号)和(数字)之间时才需要处理。对于这种情况,正则表达式是正确的选择。 - undefined
没有其他空白,但如果有的话,你可能也想要移除它。滥用正则表达式是一个问题,除非真正需要,否则不要使用。移除一个空格:不需要,解析电话号码:是的。 - undefined
2个回答

195

你应该在正则表达式中使用原始字符串,请尝试以下方式:

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
谢谢,这解决了问题。对于阅读此内容的任何人,请参考http://docs.python.org/library/re.html#raw-string-notation。 - Richard
1
另外,点击https://dev59.com/1XI95IYBdhLWcg3w8iz1#2081708,详细了解什么是原始字符串。 - Richard
在上面的示例中,您如何实际打印组名?比如说,如果组\1被称为xCoord,是否可以指示re.sub替换子字符串与组名,以便re.sub(r"(\d), (\d)", r"\1,\2", coords)结果为字符串文字xCoord,52.25378 - zelusp
2
这在Python3中不起作用。使用\1会将其替换为一些奇怪的Unicode字符。 - Cerin

30

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

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

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

如果你需要更多信息,re文档一开始就涵盖了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接