簡體   English   中英

Python非貪婪正則表達式與我期望的不完全一樣

[英]Python non-greedy regular expression is not exactly what I expected

字符串:XXaaaXXbbbXXcccXXdddOO

我想匹配以'XX'開頭'OO'結尾最小字符串。

所以我寫了一個非貪婪的reg:r'XX。*?OO'

>>> str = 'XXaaaXXbbbXXcccXXdddOO'
>>> re.findall(r'XX.*?OO', str)
['XXaaaXXbbbXXcccXXdddOO']

我以為它將返回['XXdddOO'],但它是如此“貪婪”。

然后我知道我一定弄錯了,因為上面的限定詞將首先匹配“ XX”,然后顯示為“非貪婪”。

但是我仍然想弄清楚如何才能直接獲得結果['XXdddOO'] 任何答復表示贊賞。

到現在為止,關鍵點實際上並不是關於非貪婪的問題,或者換句話說,是關於我眼中的非貪婪的問題:它應該在左限定詞(XX)和右限定詞( OO)。當然,事實是字符串是從左到右處理的。

怎么樣:

.*(XX.*?OO)

比賽將在第1組中。

確實,問題不是貪婪/非貪婪……@devnull建議的解決方案應該可以工作,只要您要避免在XXOO組之間使用單個X即可。

否則,您將不得不使用前瞻功能(即一條正則表達式,它將“偵聽”前面的字符串,並檢查它是否可以實現,但實際上不消耗任何字符)。 像這樣:

re.findall(r'XX(?:.(?!XX))*?OO', str)

通過此負前瞻,您可以(非貪婪地)匹配XX任何字符( . )。

正則表達式從左到右運行:非貪婪意味着它將匹配XXaaaXXdddOO而不匹配XXaaaXXdddOOiiiOO 如果您的數據結構是固定的,則可以執行以下操作:

XX[a-z]{3}OO

選擇XXiiiOO類的所有模式(可以根據您的需要進行調整,例如使用XX[^X]+?OO選擇從OO到該OO的最后XX對之間的所有內容:例如在XXiiiXXdddFFcccOOlll匹配XXdddFFcccOO

該行為是由於該字符串是從左到右處理的事實。 避免此問題的一種方法是使用否定的字符類:

XX(?:(?=([^XO]+|O(?!O)|X(?!X)))\1)+OO

暫無
暫無

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

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