正則 零寬斷言

2022-05-23 19:30:07 字數 2044 閱讀 2037

在使用正規表示式時,有時我們需要捕獲的內容前後必須是特定內容,但又不捕獲這些特定內容的時候,零寬斷言就起到作用了

正規表示式中有前瞻(lookahead)和後顧(lookbehind)的概念,這兩個術語非常形象的描述了正則引擎的匹配行為。需要注意一點,正規表示式中的前和後和我們一般理解的前後有點不同。一段文字,我們一般習慣把文字開頭的方向稱作「前面」,文字末尾方向稱為「後面」。但是對於正規表示式引擎來說,因為它是從文字頭部向尾部開始解析的(可以通過正則選項控制解析方向),因此對於文字尾部方向,稱為「前」,因為這個時候,正則引擎還沒走到那塊,而對文字頭部方向,則稱為「後」,因為正則引擎已經走過了那一塊地方。如下圖所示:

所謂的前瞻就是在正規表示式匹配到某個字元的時候,往「尚未解析過的文字」預先看一下,看是不是符合/不符合匹配模式,而後顧,就是在正則引擎已經匹配過的文字看看是不是符合/不符合匹配模式。符合和不符合特定匹配模式我們又稱為肯定式匹配和否定式匹配

現代高階正規表示式引擎一般都支援都支援前瞻,對於後顧支援並不是很廣泛,因此我們這裡採用否定式前瞻來實現我們的需求。

>>> re.findall(r'^.*(?:ing)$','processing')  # 1.匹配ing不儲存, 但是.*匹配到了ing, 所以最後結果儲存了

['processing']

>>> re.findall(r'^(.*)(?:ing)$','processing')  # 2.匹配到了ing, 此處.*沒有匹配到ing, 所以結果沒有儲存

['process']

>>> re.findall(r'^p.*(?:ing)$','processing')  # 這裡就明顯的看出1的效果了,p和?:一樣儲存

['processing']

>>> re.findall(r'^p(.*)(?:ing)$','processing')  # 這裡的p和?:都沒有被儲存下來, 因為分組裡沒有

['rocess']

>>> re.findall(r'^.*(?:ing)$','processinging')

['processinging']

>>> re.findall(r'^.*(?:ing)','processings')

['processing']

>>> re.findall(r'^(.*)(?:ing)','processing')

['process']

(pattern) 

匹配 pattern 並捕獲該匹配的子表示式。可以使用 $0...$9 屬性從結果「匹配」集合中檢索捕獲的匹配。若要匹配括號字元 ( ),請使用「\(」或者「\)」。 

(?:pattern) 

匹配 pattern 但不捕獲該匹配的子表示式,即它是乙個非捕獲匹配,不儲存供以後使用的匹配。這對於用「或」字元 (|) 組合模式部件的情況很有用。例如,與「industry|industries」相比,「industr(?:y| ies)」是乙個更加經濟的表示式。

(?=pattern) 

執行正向**先行搜尋的子表示式,該表示式匹配處於匹配 pattern 的字串的起始點的字串。它是乙個非捕獲匹配,即不能捕獲供以後使用的匹配。例如,「windows (?=95| 98| nt| 2000)」與「windows 2000」中的「windows」匹配,但不與「windows 3.1」中的「windows」匹配。**先行不占用字元,即發生匹配後,下一匹配的搜尋緊隨上一匹配之後,而不是在組成**先行的字元後。 

(?!pattern) 

執行反向**先行搜尋的子表示式,該表示式匹配不處於匹配 pattern 的字串的起始點的搜尋字串。它是乙個非捕獲匹配,即不能捕獲供以後使用的匹配。例如,「windows (?!95| 98| nt| 2000)」與「windows 3.1」中的「windows」匹配,但不與「windows 2000」中的「windows」匹配。**先行不占用字元,即發生匹配後,下一匹配的搜尋緊隨上一匹配之後,而不是在組成**先行的字元後。 

Java正則零寬斷言

零寬斷言的意思是 匹配寬度為零,滿足一定的條件 斷言 我也不知道這個詞語是那個王八蛋發明的,簡直是太拗口了。零寬斷言用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 b 這樣的錨定作用,僅僅用於指定乙個位置,不參與內容匹配,這個位置應該滿足一定的條件 即斷言 因此它們也被稱為...

正則基礎 零寬斷言

要多敲 注釋要清晰 零寬斷言 importre 零寬斷言 exp 零寬度正 先行斷言 先行斷言的執行步驟從要匹配的字元的最右端找到第乙個ing,再匹配前面的表示式,如果無法匹配則查詢第二個ing pattern re.compile r a z ing s pattern.findall i lov...

正規表示式 零寬斷言 五 正向零寬斷言

正向零寬斷言 1 exp 正向 先行斷言。匹配後面是exp的位置 2 exp 正向回顧後發斷言。匹配前面是exp的位置 例項演示1 exp antzone 正則 w 圖示 解釋 表示以位置0開始匹配 注意 是零寬符號,但不具備回溯 w 因為回到了0位置,則開始又一次判斷樣式 w 結果匹配成功 然後 ...