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

144 投票
2 回答
97785 浏览
提问于 2025-04-17 06:27

我想把这个字符串 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。我哪里出错了呢?

2 个回答

30

Python把\1当作一个ASCII值为1的字符,然后把这个字符传给sub函数。

可以使用原始字符串,这样Python就不会对\进行解释。

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

如果你需要更多信息,可以在re文档的开头找到相关内容。

200

你应该使用原始字符串来处理正则表达式,试试下面这个:

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)。

撰写回答