【问题标题】:Handling backreferences to capturing groups in re.sub replacement pattern在 re.sub 替换模式中处理对捕获组的反向引用
【发布时间】: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(' ', '')

标签: python regex


【解决方案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 任何阅读本文的人。
  • 另外stackoverflow.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 的开头进行介绍。

【讨论】:

    猜你喜欢
    • 2015-02-22
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2018-07-19
    相关资源
    最近更新 更多