簡體   English   中英

在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 ,然后檢查,如果輸入到左-第二ofoo -比賽= 當然,這總是失敗的。

您為什么不只使用:

(foo)=?(bar)?

另外,以下表達式似乎更正確,因為它捕獲了完全匹配中的“ =”,但原始表達式根本沒有捕獲到它:

(foo).?((?<==)bar)?

暫無
暫無

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

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