python re:正向肯定預查(?=)和反向肯定預查(?<=)


參考資料:https://tool.oschina.net/uploads/apidocs/jquery/regexp.html

(?=pattern) 正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。
(?<=pattern) 反向肯定預查,與正向肯定預查類擬,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?:pattern) 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。

 

參考:https://docs.python.org/zh-cn/3.7/library/re.html#re.Pattern.match

(?=…)

匹配  的內容,但是並不消費樣式的內容。這個叫做 lookahead assertion。比如, Isaac (?=Asimov) 匹配 'Isaac ' 只有在后面是 'Asimov' 的時候。

(?!…)

匹配  不符合的情況。這個叫 negative lookahead assertion (前視取反)。比如說, Isaac (?!Asimov) 只有后面  是 'Asimov' 的時候才匹配 'Isaac ' 。

(?<=…)

匹配字符串的當前位置,它的前面匹配  的內容到當前位置。這叫:dfn:positive lookbehind assertion (正向后視斷定)。 (?<=abc)def 會在 'abcdef' 中找到一個匹配,因為后視會往后看3個字符並檢查是否包含匹配的樣式。包含的匹配樣式必須是定長的,意思就是 abc 或 a|b 是允許的,但是 a* 和 a{3,4} 不可以。注意以 positive lookbehind assertions 開始的樣式,如 (?<=abc)def ,並不是從 a 開始搜索,而是從 d 往回看的。你可能更加願意使用 search() 函數,而不是 match() 函數:

>>> import re >>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0) 'def' 

這個例子搜索一個跟隨在連字符后的單詞:

>>> m = re.search(r'(?<=-)\w+', 'spam-egg') >>> m.group(0) 'egg'

 

example:

import re

pattern1=re.compile(r'(?<=\().*')
pattern2=re.compile(r'(?<=\().*(?=\))')
str1 = pattern1.sub('0000000' ,'adod(23d)das')
print(str1)
str2 = pattern2.sub('0000000' ,'adod(23d)das')
print(str2)

m = re.search('(?<=abc)def', 'abcdef')
print(m.group())

m1 = re.search('abcd(?=def)', 'abcddef abcdef')
print(m1.group())

運行結果如下所示:

adod(0000000
adod(0000000)das
def
abcd

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM