Python re.sub返回引用不返回引用

cst*_*fel 26 python regex

我有以下内容:

<text top="52" left="20" width="383" height="15" font="0"><b>test</b></text>
Run Code Online (Sandbox Code Playgroud)

我有以下内容:

fileText = re.sub("<b>(.*?)</b>", "\1", fileText, flags=re.DOTALL)
Run Code Online (Sandbox Code Playgroud)

其中fileText是我在上面发布的字符串.当我fileText运行正则表达式替换后打印出来时,我回来了

<text top="52" left="20" width="383" height="15" font="0"></text>
Run Code Online (Sandbox Code Playgroud)

而不是预期的

<text top="52" left="20" width="383" height="15" font="0">test</text>
Run Code Online (Sandbox Code Playgroud)

现在我对正则表达式相当熟练,我知道它应该可以工作,事实上我知道它匹配正确,因为我可以在groups搜索和打印出来的时候看到它groups但是我是python的新手而且我很困惑为什么它没有正确使用后向引用

iCo*_*dez 59

您需要在此处使用原始字符串,以便不将反斜杠作为转义字符处理:

>>> import re
>>> fileText = '<text top="52" left="20" width="383" height="15" font="0"><b>test</b></text>'
>>> fileText = re.sub("<b>(.*?)</b>", r"\1", fileText, flags=re.DOTALL)
>>> fileText
'<text top="52" left="20" width="383" height="15" font="0">test</text>'
>>>
Run Code Online (Sandbox Code Playgroud)

请注意如何"\1"更改为r"\1".虽然这是一个非常小的变化(一个字符),但它有很大的影响.见下文:

>>> "\1"
'\x01'
>>> r"\1"
'\\1'
>>>
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,在 Python 2 和 3 中,它都没有为我返回完整的字符串。我只得到了替换的文本,而不是整个字符串。 (2认同)
  • 也在解释器中对其进行了测试,它可以工作。它在已执行的文件中不起作用。很奇怪:P (2认同)