[英]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建議的解決方案應該可以工作,只要您要避免在XX
和OO
組之間使用單個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.