我尝试通过从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>
。这可能是我在这里失踪的非常愚蠢的事情,但我真的很难想出这个问题。
答案 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>'