[英]Python regex: Difference between (.+) and (.+?)
我是 regex 和 Python 的 urllib 的新手。 我瀏覽了一個關於網絡抓取的在線教程,它有以下代碼。 在研究了正則表達式之后,在我看來,我可以在正則表達式中使用 (.+) 而不是 (.+?) ,但是我錯了。 我最終打印了比我想要的更多的 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 id="yfs_l84_sbux">foo bar</span><span id="yfs_l84_sbux2">foo bar</span>
這個正則表達式匹配整個事情:
<span id="yfs_l84_sbux">(.+)<\/span>
它一直走到最后,然后“返回”一個</span>
,但其余的正則表達式匹配最后一個</span>
,因此完整的正則表達式匹配整個 HTML 塊。
但是這個正則表達式在第一個</span>
處停止:
<span id="yfs_l84_sbux">(.+?)<\/span>
?
是一個非貪婪的修飾符。 *
默認情況下是一個貪婪的重復運算符 - 它會吞噬它所能吞噬的一切; 什么時候修改?
它變得不貪婪,並且只會吃掉滿足它的量。
因此對於
<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
,導致你得到什么 - 遠遠超過你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.