[英]Python regex with look behind and alternatives
我想要一個正則表達式,找到“包裹”在“HEAD或HEADa”和“HEAD”之間的文本。也就是說,我可能有一個以第一個單詞開頭的文本作為HEAD或HEADa以及下面的“head” “屬於HEAD類型。
HEAD\\n\\n text...text...HEAD \\n\\n text....text HEAD\\n\\n text....text .....
HEADa\\n\\n text...text...HEAD \\n\\n text....text HEAD\\n\\n text....text .....
我只想捕獲“頭部”之間的文本,因此我有一個背后的正則表達式,並向前看表達式尋找我的“頭”。 我有以下正則表達式:
var = "HEADa", "HEAD"
my_pat = re.compile(r"(?<=^\b"+var[0]+r"|"+var[1]+r"\b) \w*\s\s(.*?)(?=\b"+var[1] +r"\b)",re.DOTALL|re.MULTILINE)
但是,當我嘗試執行此正則表達式時,我收到一條錯誤消息,指出我在后面的表達式中不能有可變長度。 這個正則表達式有什么問題?
目前,你的正則表達式的第一部分看起來像這樣:
(?<=^\bHEADa|HEAD\b)
你有兩種選擇; 一個匹配五個字符,另一個匹配四個,這就是你得到錯誤的原因。 一些正則表達式的風格會讓你這樣做,即使他們說他們不允許可變長度的lookbehinds,但不允許Python。 您可以將其分解為兩個lookbehinds,如下所示:
(?:(?<=^HEADa\b)|(?<=\bHEAD\b))
......但是你可能不需要為了這個而需要lookbehinds。 試試這個:
(?:^HEADa|\bHEAD)\b
無論后來(.*?)
匹配的是(.*?)
,仍然可以通過組#1獲得。 如果你真的需要整個分隔符之間的文本,你可以捕捉,在組#1,和其他集團將成為#2(或者你可以使用命名組,而不必跟蹤號碼)。
一般來說,lookbehind永遠不應該是你的第一手段。 對於這項工作來說,這似乎是一個顯而易見的工具,但通常情況下,您最好不要進行直接匹配並使用捕獲組提取所需的部分。 所有風味都是如此,而不僅僅是Python; 只是因為你可以用其他口味的外觀做更多的事情並不意味着你應該這樣做 。
順便說一句,您可能已經注意到我重新分配了您的單詞邊界; 我認為這是你真正想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.