簡體   English   中英

Python正則表達式中的非貪婪

[英]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 ,您將看到以下內容:

  • 嘗試0 a plus b vs aaab :不匹配( b != a
  • 試試a plus b vs aaab :不匹配( ab != aa
  • 嘗試0 abaab :不匹配( b != a )(匹配位置向右移動一個)
  • 嘗試1 abaab :不匹配( ab != aa
  • 嘗試0 a plus b vs ab :不匹配( b != a )(匹配位置向右移動一個)
  • 試試1 a plus b vs abmatchab == ab

對於*?同樣*?

事實是search功能返回最左邊的匹配。 使用?? *? 僅更改行為以偏愛最短的最左邊的匹配,但不會返回以已找到的匹配的右邊開始的較短的匹配。

還要注意, re模塊不會返回重疊的匹配項,因此即使使用findallfinditer您也將無法找到要查找的兩個匹配項。

因為這個?? ? 是貪婪的。一個懶惰的量詞將匹配零或一個(其左令牌),如果仍允許整體模式匹配,則為零。例如,以下所有內容將返回一個空字符串:

>>> print(re.search('a??','a').group())

>>> print(re.search('a??','aa').group())

>>> print(re.search('a??','aaaa').group())

正則表達式a??b將匹配abb

>>> 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.

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