在 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) 问题