如何从html文件中提取定义?

时间:2017-06-15 22:14:45

标签: python html regex python-3.x

我尝试通过从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)

它实际上并没有停留在</dd></dl>。这可能是我在这里失踪的非常愚蠢的事情,但我真的很难想出这个问题。

2 个答案:

答案 0 :(得分:2)

从某种意义上说,正则表达式从左到右进行评估。所以在你的正则表达式中,

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

正则表达式引擎会首先查找<dd><p>,然后它会依次查看以下每个字符,检查每个字符是否为非数字或3,如果是,将其添加到比赛中。事实证明,</dd></dl>中的所有字符都在班级&​​#34;非数字或3&#34;中,因此所有这些字符都会添加到[\D3]+匹配的部分,引擎尽职尽责。它只会在找到3以外的数字字符时停止,然后继续&#34;注意&#34;正则表达式的其余部分(</dd></dl>)。

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

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

(注意添加的?)这意味着正则表达式引擎应该保守多少添加到匹配中。而不是试图吞噬&#34;尽可能多的字符,它现在会尝试将[\D3]+?与一个字符匹配,然后继续查看正则表达式的其余部分是否匹配,如果不匹配,它将尝试匹配[\D3]+?只有两个字符,依此类推。

基本上,[\D3]+匹配尽可能最长的[\D3]字符串,但仍然可以让完整的正则表达式匹配,而[\D3]+?匹配[\D3]的最短字符串{ {1}}它仍然可以让完整的正则表达式匹配。

当然{34}在现实世界&#34;中,但如果你只是想练习正则表达式,这可能和任何文本样本一样好。

答案 1 :(得分:1)

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

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