【问题标题】:Regular Expression Processing HTML正则表达式处理 HTML
【发布时间】:2014-11-04 10:38:04
【问题描述】:

我需要替换网页源代码中的所有 HTML 标签(例如<p><img> 等),但我想保留<br><br/>。我试过了:

re.sub(r'<[^>]+?>', u'', html, flags=re.I)

这只能达到第一个目标,但不能保留&lt;br&gt;&lt;br/&gt;r'&lt;[^&gt;br]+?&gt;' 也达不到目的。

什么是正确的正则表达式?

【问题讨论】:

  • 不要使用正则表达式来操作 HTML - HTML 不是常规语言。使用 HTML 解析器。 (Amusing version.)
  • @jonrsharpe 我知道你指的是 BeautifulSoup 等。但我不想为这个简单的问题安装另一个插件。
  • 标准库中也有解析器:HTMLParser
  • 有一天人们会停止尝试用锤子拧开螺栓(也就是使用正则表达式解析 html)?
  • 我对您提出的另一个问题有正确答案,但您出于某种原因将其删除。 re.sub(r"((&lt;br\/?&gt;)+)", "&lt;br&gt;", html, flags=re.I|re.UNICODE) 你遇到的问题是你错过了 flags 关键字,所以它把 re.I|re.UNICODE 当作 count kwarg,将它限制为只有前 33 个替换 - 这让它看起来什么都不是发生,因为您只查看输入文本的最后一行。我在这里回答是因为无法向您发送答案。

标签: python html regex


【解决方案1】:

下面带有否定前瞻断言的正则表达式可以工作。

<(?!br\/?>)[^<>]*>

DEMO

【讨论】:

    【解决方案2】:
    <((?!\bbr\b).)*?>
    

    这应该适用于您的情况。负前瞻将确保不会选择 &lt;br&gt;

    编辑:

    <(?:(?!\bbr\/?(?=>)).)*?>
    

    如果你有这样荒谬的事情,试试这个。 &lt;a href="http://host.domain.tld/br"&gt;

    查看演示。

    http://regex101.com/r/sU3fA2/57

    【讨论】:

    • 这行不通|)[^>])+?>。保留了其他一些标签。
    • 所有标签(包括&lt;br&gt;)仍然被删除。这种负前瞻是否正确。
    • 你似乎犯了一个小错误。这有效:&lt;((?!br)[^&gt;])+?&gt; 在大括号内的br 之前包含一个额外的&lt;。对吗?
    • 为什么要包含|\/brbr只有三个版本:&lt;br&gt;, &lt;br/&gt;, &lt;br /&gt;
    • 您最好在答案中使用The negative lookahead 而不是The lookahead,这样新手就不会感到困惑。只是我谦虚的建议。前瞻是正则表达式中最困难的部分之一。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2011-09-14
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多