我是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)
找到打印
.+
是贪婪的——它匹配到无法匹配为止,并且只根据需要返回。.+?
不是——它一有机会就停下来。示例:
假设您有这个HTML:
这个正则表达式与整个匹配:
它一直到最后,然后“返回”一个
</span>
,但是其余的regex与最后一个</span>
匹配,所以完整的regex与整个HTML块匹配。但是这个正则表达式在第一个
</span>
处停止:(.+)
是贪婪的。它会尽其所能,并在需要时给予回报。(.+?)
是不清晰的。它需要尽可能少的。见:
此外,比较“Regex调试器日志”here和here将显示ungreedy修饰符更有效的作用。
?
是一个非贪婪修饰符。*
默认情况下是一个贪婪的重复运算符-它将吞噬它所能吞噬的一切;当被?
修改时,它将变为非贪婪的,并且只会吃掉满足它的所有东西。因此
.*?</span>
将吃光want
,然后点击</span>
-这满足了regexp的最小重复.
,导致<span id="yfs_l84_sbux">want</span>
匹配。然而,.*
将尝试看看它是否能吃得更多-它将去寻找另一个</span>
,与.*?
匹配的want</span>text<span id="somethingelse">dontwant
,结果你得到的-远远超过你想要的。相关问题 更多 >
编程相关推荐