【问题标题】:Python re.sub back reference not back referencing [duplicate]Python re.sub 反向引用不反向引用[重复]
【发布时间】:2014-01-12 22:54:19
【问题描述】:

我有以下几点:

<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 是我在上面发布的字符串。当我在运行正则表达式替换后打印出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 时,我可以在 groups 中看到它,但我我是 python 新手,我很困惑为什么它不能正确使用反向引用

【问题讨论】:

  • 关于使用正则表达式解析 HTML 的一般免责声明...
  • 不使用正则表达式进行解析,只是删除所有粗体标签而已。我有一组非常有限的 html 正在使用,并且以我知道 是叶节点的特定方式

标签: python regex


【解决方案1】:

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

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

【讨论】:

  • 奇怪,在 Python 2 和 3 中,它都不会为我返回完整的字符串。我只得到替换的文本,而不是整个字符串。
  • 也在解释器中对其进行了测试,它在那里工作。它在执行的文件中不起作用。很奇怪:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 2020-09-28
  • 2012-10-30
  • 2012-08-13
  • 1970-01-01
相关资源
最近更新 更多