[英]Equivalent to (.*) in negative look behind assertion Regex Python
[英]Trouble with positive look behind assertion in python regex
試圖使用一個相當長的正則表達式,它可以歸結為這一小節,與我的預期不符。
>>> re.search(r'(foo)((?<==)bar)?', 'foo').groups()
('foo', None)
>>> re.search(r'(foo)((?<==)bar)?', 'foo=bar').groups()
('foo', None)
第一個是我想要的,第二個應該返回('foo', 'bar')
。
我懷疑我只是誤解了幕后手段是如何工作的,一些解釋會很好。
目標后面的目標永遠不會包含在匹配中-應該用作錨點,但實際上不被正則表達式消耗。
僅當當前位置位於目標后面時,后向模式才應該匹配。 在您的情況下,在匹配字符串中的“ foo”之后,當前位置在“ =”處,該位置不以“ =”開頭,而是以“ o”開頭。
另一種查看方法是查看重新文檔並閱讀
請注意,以正向后斷言開頭的模式在搜索的字符串的開頭永遠不會匹配;
匹配foo
,后面的樣子試圖在字符串的開頭(其余部分)進行匹配-這將永遠無法進行。
其他人建議使用正則表達式可能會更好地為您服務,但我認為您可能正在尋找
>>> re.search('(foo)(=(bar))?', 'foo=bar').groups()
('foo', '=bar', 'bar')
如果您發現多余的組有點煩人,則可以省略內部的“()”,然后將匹配的組中的第一個字符砍掉...
您可能只想要(foo)(?:=(bar))?
使用非捕獲組(?:)
。
向后斷言僅在當前位置的左側查找,並檢查提供的表達式是否匹配。 因此你的表達式匹配foo
,然后檢查,如果輸入到左-第二o
在foo
-比賽=
。 當然,這總是失敗的。
您為什么不只使用:
(foo)=?(bar)?
另外,以下表達式似乎更正確,因為它捕獲了完全匹配中的“ =”,但原始表達式根本沒有捕獲到它:
(foo).?((?<==)bar)?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.