【问题标题】:Python regular expression to find pattern that is outside specific HTML tags [duplicate]Python正则表达式查找特定HTML标签之外的模式[重复]
【发布时间】:2020-02-10 00:21:28
【问题描述】:

我正在尝试编写一个正则表达式来获取所有出现在特定 HTML 标记之间的模式 !\d+

输入示例(Regex101 上提供):

bla bla !1234 abcd <pre> every occurrence here should be ignored !12345 but it is not </pre> here should be captured !54321 but <code><pre> here it should be again ignored !76453 </pre></code> and here again captured !123456

我试过这个 RE:

(?:<(?P<tag>code|pre)>.*?<\/(?P=tag)>)?(?!<(code|pre)>)*!(\d+)

逻辑是这样的:

  • (?:&lt;(?P&lt;tag&gt;code|pre)&gt;.*?&lt;/(?P=tag)&gt;)?:捕获RE第一部分相关标签之间的所有文本,这样如果标签之间出现模式,就会被这个RE消费掉
  • (?!&lt;(code|pre)&gt;)*: 确保 RE 的第一部分和所需模式之间没有其他开始标签
  • !(\d+):匹配图案,抢号

这似乎不起作用,我不太明白为什么。标签之间的数字仍然匹配。 这是为什么呢?

谢谢。

【问题讨论】:

  • 正则表达式查找特定 HTML 标记之外的模式我们真的还在这样做吗?
  • 我想我找到了解决方案:(?:&lt;(pre|code)&gt;.*?&lt;/\1&gt;|!(\d+)) 似乎做到了。这个想法是使用“或”表达式来捕获所需标签之间的所有文本,并且!\d+ 模式只有在它没有包含在标签中时才会匹配。 @Toto:建议的帖子似乎没有回答我的正则表达式问题。它建议了其他几种 HTML 解析方法。正如这篇文章的另一条评论中所解释的那样,我专门询问了一个正则表达式。

标签: python regex


【解决方案1】:

很难编写处理 html 的正则表达式。您可以让 html 解析器做它最擅长的事情,只需在数据元素上使用正则表达式。只要所需的数据本身没有标记(例如,!12&lt;b&gt;34&lt;/b&gt;),这将做得很好

from html.parser import HTMLParser
import re

class HTMLTagFilteredFinder(HTMLParser):

    def __init__(self, *args, **kw):
        super().__init__(*args, **kw)
        self.ignoring_children = 0
        self.found_strings = []

    def handle_starttag(self, tag, attrs):
        if tag in ('code', 'pre'):
            self.ignoring_children += 1

    def handle_endtag(self, tag, attrs):
        if tag in ('code', 'pre'):
            self.ignoring_children -= 1

    def handle_data(self, data):
        if not self.ignoring_children:
            self.found_strings.extend(re.findall(r"!\d+", data))

【讨论】:

  • 如果你从一个谎言开始,你就很难认真对待这个答案。编写一个处理 html 的正则表达式绝对不是不可能的——当然不是像 OP 那样简单。我确实同意使用 html 解析器可能在几乎所有方面都更好,但这并不需要一个错误的事实作为开场白。
  • @Grismar 降级为“困难”。
  • 我目前正在尝试找到解决此问题的正则表达式解决方案,然后再求助于其他解决方案。显然实现这一点并不困难,但我有一个非常简洁的实现来解决这个正则表达式将完成的特定问题。因此,在决定如何继续之前,我首先更愿意了解我在开篇文章中缺少正则表达式的内容。此外,通过理解这个正则表达式问题,我会学到更多,而不是放弃它。
  • @YoelEinhoren - 这是一个有趣的挑战。祝你好运!
猜你喜欢
  • 2018-11-10
  • 2019-04-15
  • 2020-11-04
  • 2020-12-15
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多