Python正则表达式:(.+)和(.+?)之间的区别

use*_*620 1 python regex urllib

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

PS.这是一个星巴克股票报价刮刀.

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)
Run Code Online (Sandbox Code Playgroud)

打印发现

eli*_*ide 7

.+ 是贪婪的 - 它匹配,直到它不再匹配,只返回所需的数量.

.+? 不是 - 它在第一次机会停止.

例子:

假设你有这个HTML:

<span id="yfs_l84_sbux">foo bar</span><span id="yfs_l84_sbux2">foo bar</span>
Run Code Online (Sandbox Code Playgroud)

这个正则表达式匹配整个事情:

<span id="yfs_l84_sbux">(.+)<\/span>
Run Code Online (Sandbox Code Playgroud)

它一直到最后,然后"返回"一个</span>,但正则表达式的其余部分匹配最后一个</span>,所以完整的正则表达式匹配整个HTML块.

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

<span id="yfs_l84_sbux">(.+?)<\/span>
Run Code Online (Sandbox Code Playgroud)