【问题标题】:How do I extract definitions from a html file?如何从 html 文件中提取定义?
【发布时间】:2017-06-15 22:14:45
【问题描述】:

我正在尝试通过从 Python 的标准库 built-in functions 页面中提取函数定义来练习正则表达式。到目前为止,我所做的是定义通常打印在<dd><p></dd></dl> 之间。当我尝试时

import re
fname = open('functions.html').read()
deflst = re.findall(r'<dd><p>([\D3]+)</dd></dl>', fhand)

它实际上并没有停在&lt;/dd&gt;&lt;/dl&gt;。这可能是我在这里遗漏的非常愚蠢的事情,但我真的很难弄清楚这一点。

【问题讨论】:

    标签: python html regex python-3.x


    【解决方案1】:

    在某种意义上,正则表达式是从左到右计算的。所以在你的正则表达式中,

    r'<dd><p>([\D3]+)</dd></dl>'
    

    正则表达式引擎将首先查找&lt;dd&gt;&lt;p&gt;,然后依次查看以下每个字符,检查每个字符是非数字还是3,如果是,则将其添加到匹配项中。原来&lt;/dd&gt;&lt;/dl&gt; 中的所有字符都在“nondigit 或3”类中,所以它们都被添加到[\D3]+ 匹配的部分,并且引擎尽职尽责地继续运行。它只会在找到不是3 的数字字符时停止,然后继续“注意”正则表达式的其余部分(&lt;/dd&gt;&lt;/dl&gt;)。

    要解决这个问题,您可以像这样使用不情愿的量词:

    r'<dd><p>([\D3]+?)</dd></dl>'
    

    (注意添加的?)这意味着正则表达式引擎应该保守地添加到匹配中的数量。它不再尝试“吞噬”尽可能多的字符,而是尝试将[\D3]+? 匹配到一个字符,然后继续查看其余的正则表达式是否匹配,如果不匹配,它将尝试匹配@ 987654333@ 只有两个字符,依此类推。

    基本上,[\D3]+ 匹配[\D3] 的最长可能字符串,同时仍然允许完整的正则表达式匹配,而[\D3]+? 匹配[\D3] 的最短可能字符串,同时仍然可以让完整的正则表达式匹配。


    当然是“现实世界”中的one shouldn't really be using regular expressions to parse HTML,但如果你只是想练习正则表达式,这可能是一个很好的文本示例。

    【讨论】:

    • 啊,非常感谢您的解释!很有帮助!
    【解决方案2】:

    默认情况下,所有量词都是greedy,这意味着它们希望匹配尽可能多的字符。您可以在量词后使用? 使其匹配尽可能少的字符的lazy\d+? 至少匹配一位数字,但越少越好。

    试试r'&lt;dd&gt;&lt;p&gt;([\D3]+?)&lt;/dd&gt;&lt;/dl&gt;'

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 2011-04-27
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 2021-01-22
      • 2010-12-21
      相关资源
      最近更新 更多