【问题标题】:Python regex: remove certain HTML tags and the contents in themPython 正则表达式:删除某些 HTML 标记及其中的内容
【发布时间】:2013-07-03 13:17:51
【问题描述】:

如果我有一个包含这个的字符串:

<p><span class=love><p>miracle</p>...</span></p><br>love</br>

我想删除字符串:

<span class=love><p>miracle</p>...</span>

也许还有一些其他的 HTML 标签。同时,其他标签和其中的内容都会被保留。

结果应该是这样的:

<p></p><br>love</br>

我想知道如何使用正则表达式模式来做到这一点? 我尝试过的:

r=re.compile(r'<span class=love>.*?(?=</span>)')
r.sub('',s)

但它会离开

</span>

这次你能帮我使用re模块吗?接下来我将学习html解析器

【问题讨论】:

  • and maybe some other HTML tags.. - 如果你要删除很多不同的东西,你应该考虑解析 HTML 而不是使用正则表达式。
  • 在正则表达式中无法做到这一点...使用 html 解析器
  • @Anirudh - 不正确,正如 poke 的回答所证明的那样,正则表达式可以选择两个字符串以及介于两者之间的任何内容
  • @Anirudh 完全错误,正如 Chris Stratton 强调的那样。人们对“正则表达式无法解析 HTML 文档”的教义断言如此着迷,以至于他们一看到 HTML 文本上的一些正则表达式就会写任何东西。
  • @ChrisStratton 1>如果有嵌套的跨度标签,答案中的正则表达式将不起作用..2>很多时候跨度标签没有结束标签,因此破坏了代码..有n 没有其他情况会导致该正则表达式失败..如果您愿意,我可以列出 10 个其他正则表达式会中断的情况

标签: python html regex tags


【解决方案1】:

第一件事:Don’t parse HTML using regular expressions

话虽如此,如果该跨度标记中没有额外的跨度标记,那么您可以这样做:

text = re.sub('<span class=love>.*?</span>', '', text)

附带说明:段落标签不应该放在跨度标签内(只有phrasing content 是)。


你试过的表达式&lt;span class=love&gt;.*?(?=&lt;/span&gt;),已经很不错了。问题是前瞻 (?=&lt;/span&gt;) 永远不会匹配它所期待的。所以表达式将立即停止 before 结束 span 标签。您现在可以在末尾手动添加一个关闭跨度,即&lt;span class=love&gt;.*?(?=&lt;/span&gt;)&lt;/span&gt;,但这并不是必需的:.*? 是一个非贪婪表达式。它将尝试尽可能少地匹配。所以在.*?&lt;/span&gt; 中,.*? 只会匹配,直到找到它立即停止的关闭跨度。

【讨论】:

  • 你的回答对我很有帮助!比我的好! StackOverFlow问题第一次发帖,请及时关注并解决!谢谢!
  • @poke 他不想解析 HTML 文档,他只想替换其中的某些部分。
  • @eyquem 我完全清楚这一点。这只是一个免责声明,我知道该主题,我将其添加到任何类似的答案中,以防止人们争论 HTML 和正则表达式主题......:/
  • 好的,谢谢,这是一个很好的预防措施。但我不喜欢链接的帖子,它几乎没有解释为什么正则表达式无法解析 XML 文档
猜你喜欢
  • 2010-09-12
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
相关资源
最近更新 更多