簡體   English   中英

Python 正則表達式:(.+) 和 (.+?) 之間的區別

[英]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 ,導致你得到什么 - 遠遠超過你想要的。

(.+)是貪婪的。 它盡其所能,並在需要時回饋。

(.+?)是不貪婪的。 它需要盡可能少。

看:

delegate

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

此外,比較此處此處的“Regex 調試器日志”將向您展示 ungreedy 修飾符更有效的作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM