[英]Non-greedy in Python Regex
我嘗試理解python中的非貪婪正則表達式,但我不理解為什么以下示例具有此結果:
print(re.search('a??b','aaab').group())
ab
print(re.search('a*?b','aaab').group())
aaab
我以為第一個是“ b”,第二個是“ ab”。 誰能解釋一下?
發生這種情況是因為您隨后要求匹配。 如果您嘗試遵循從左到右匹配a??b
,您將看到以下內容:
a
plus b
vs aaab
:不匹配( b != a
) a
plus b
vs aaab
:不匹配( ab != aa
) a
加b
對aab
:不匹配( b != a
)(匹配位置向右移動一個) a
加b
對aab
:不匹配( ab != aa
) a
plus b
vs ab
:不匹配( b != a
)(匹配位置向右移動一個) a
plus b
vs ab
: match ( ab == ab
) 對於*?
同樣*?
。
事實是search
功能返回最左邊的匹配。 使用??
和*?
僅更改行為以偏愛最短的最左邊的匹配,但不會返回以已找到的匹配的右邊開始的較短的匹配。
還要注意, re
模塊不會返回重疊的匹配項,因此即使使用findall
或finditer
您也將無法找到要查找的兩個匹配項。
因為這個??
懶 ?
是貪婪的。一個懶惰的量詞將匹配零或一個(其左令牌),如果仍允許整體模式匹配,則為零。例如,以下所有內容將返回一個空字符串:
>>> print(re.search('a??','a').group())
>>> print(re.search('a??','aa').group())
>>> print(re.search('a??','aaaa').group())
正則表達式a??b
將匹配ab
或b
:
>>> print(re.search('a??b','aaab').group())
ab
>>> print(re.search('a??b','aacb').group())
b
如果它不允許整體模式匹配,並且沒有任何b
,它將返回None:
>>> print(re.search('a??b','aac').group())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'
關於第二部分,您有一個非貪婪的正則表達式,結果非常明顯,它將匹配任意數量的a
然后是b
:
print(re.search('a*?b','aaab').group())
aaab
模式說明- /a??b/
a??
將字符a
字面上匹配(區分大小寫),然后使用量詞??
表示在零到一次之間,盡可能少地擴展,根據需要擴展[惰性],然后字符b
應該字面上匹配(區分大小寫)
因此它將匹配給定字符串'aaab'
中的最后'ab'
字符
對於模式- /a*?b/
a*?
從字面上匹配字符'a'
(區分大小寫)。這里的量詞*?
表示在零到無限制的時間之間,盡可能少地擴展,根據需要擴展[惰性],然后字符b
應該字面上匹配(區分大小寫)。
因此它將與'aaab'
中的'aaab'
整體匹配
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.