Python re.sub反向引用未进行反向引用

33

我有以下内容:

<text top="52" left="20" width="383" height="15" font="0"><b>test</b></text>

我有以下内容:

fileText = re.sub("<b>(.*?)</b>", "\1", fileText, flags=re.DOTALL)

文件中的字符串为我上面发布的那个字符串。当我运行正则表达式替换后,打印出fileText,我得到了以下结果

<text top="52" left="20" width="383" height="15" font="0"></text>

与预期不同

<text top="52" left="20" width="383" height="15" font="0">test</text>

现在我相当熟练地掌握了正则表达式,并且知道它应该起作用,实际上我知道它匹配得很好,因为当我进行搜索并打印出组时,我可以在groups中看到它,但是我对Python还不熟悉,不明白为什么反向引用不能正常工作。


3
通常的免责声明:使用正则表达式解析 HTML... - Daniel Roseman
4
不使用正则表达式解析,只需删除所有粗体标签即可。我有一个非常有限的HTML集合,以特定的方式使用,其中我知道<b>是一个叶节点。 - csteifel
1个回答

86

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

>>> 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>'
>>>

注意如何将"\1"更改为r"\1"。虽然这只是一个非常小的更改(一个字符),但它有很大的影响。请参见下面:
>>> "\1"
'\x01'
>>> r"\1"
'\\1'
>>>

2
奇怪的是,在Python 2和3中,它都没有返回完整的字符串。我只得到了替换后的文本,而不是整个字符串。 - user1467267
2
在解释器中测试过了,它能工作。但在执行的文件中却不行,非常奇怪 :P - user1467267
1
另外,双反斜杠“\1”也可以。 - Klaws

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接