Python regex:(.+)和(.+?)之间的区别

2024-05-15 09:40:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我是regex和Python的urllib新手。我浏览了一个关于web报废的在线教程,它有以下代码。在研究了正则表达式之后,在我看来,我可以使用(.+)而不是(.+?)但我错了。我最终打印的html代码比我想要的多。我以为我已经掌握了正则表达式的窍门,但现在我很困惑。请向我解释一下这两个表达式之间的区别,以及为什么它会捕获这么多html。谢谢!

这是星巴克的股票报价刮刀。

import urllib
import re

url = urllib.urlopen("http://finance.yahoo.com/q?s=SBUX")
htmltext = url.read()
regex = re.compile('<span id="yfs_l84_sbux">(.+?)</span>')
found = re.findall(regex, htmltext)

找到打印


Tags: 代码importreweburl表达式htmlurllib
3条回答

.+是贪婪的——它匹配到无法匹配为止,并且只根据需要返回。

.+?不是——它一有机会就停下来。

示例:

假设您有这个HTML:

<span id="yfs_l84_sbux">foo bar</span><span id="yfs_l84_sbux2">foo bar</span>

这个正则表达式与整个匹配:

<span id="yfs_l84_sbux">(.+)<\/span>

它一直到最后,然后“返回”一个</span>,但是其余的regex与最后一个</span>匹配,所以完整的regex与整个HTML块匹配。

但是这个正则表达式在第一个</span>处停止:

<span id="yfs_l84_sbux">(.+?)<\/span>

(.+)是贪婪的。它会尽其所能,并在需要时给予回报。

(.+?)是不清晰的。它需要尽可能少的。

见:

delegate

[delegate] /^(.+)e/
[de]legate /^(.+?)e/

此外,比较“Regex调试器日志”herehere将显示ungreedy修饰符更有效的作用。

?是一个非贪婪修饰符。*默认情况下是一个贪婪的重复运算符-它将吞噬它所能吞噬的一切;当被?修改时,它将变为非贪婪的,并且只会吃掉满足它的所有东西。

因此

<span id="yfs_l84_sbux">want</span>text<span id="somethingelse">dontwant</span>

.*?</span>将吃光want,然后点击</span>-这满足了regexp的最小重复.,导致<span id="yfs_l84_sbux">want</span>匹配。然而,.*将尝试看看它是否能吃得更多-它将去寻找另一个</span>,与.*?匹配的want</span>text<span id="somethingelse">dontwant,结果你得到的-远远超过你想要的。

相关问题 更多 >