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

Posted

技术标签:

【中文标题】在 re.sub 替换模式中处理对捕获组的反向引用【英文标题】:Handling backreferences to capturing groups in re.sub replacement pattern 【发布时间】:2011-12-30 17:34:30 【问题描述】:

我想获取字符串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。我做错了什么?

【问题讨论】:

由于您实际上并不想捕获数字,因此使用环视可能更有意义,即:re.sub(r'(?<=\d), (?=\d)', ',', coords) 这个特定问题不需要正则表达式,使用替换:coords.replace(' ', '') 【参考方案1】:

您应该对正则表达式使用原始字符串,请尝试以下操作:

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

【讨论】:

谢谢,成功了。 docs.python.org/library/re.html#raw-string-notation 任何阅读本文的人。 另外***.com/questions/2081640/… 可以更好地解释什么是原始字符串。 您将如何实际打印上例中的组名?比如说,如果组 \1 被称为 xCoord,是否可以指示 re.sub 用组名替换子字符串,使得 re.sub(r"(\d), (\d)", r"\1,\2", coords) 导致字符串文字 xCoord,52.25378 这在 Python3 中不起作用。使用 \1 将其替换为一些奇怪的 unicode 字符。【参考方案2】:

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

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

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

如果您需要更多信息,请在 re documentation 的开头进行介绍。

【讨论】:

以上是关于在 re.sub 替换模式中处理对捕获组的反向引用的主要内容,如果未能解决你的问题,请参考以下文章

Python re 中的命名反向引用 (?P=name) 问题

使用re.sub将文本替换为匹配到的内容

re.sub

Python - re.sub 返回模式而不是替换

为re.sub替换参数转义Python正则表达式字符串? [复制]

re.sub用法