本測(cè)試使用python的re.compile與re.search作為方法測(cè)試包含error不包含abc的實(shí)例
python簡(jiǎn)單正則里只介紹到了不包含某字符的正則:[^1-9a-z],[^abc]也只能完成不匹配a、b、c三個(gè)字母的功能,但是這個(gè)并不能實(shí)現(xiàn)不匹配"abc“字符串的功能
這里要用到正則表達(dá)式中的斷言知識(shí):
(?=X )
零寬度正先行斷言。僅當(dāng)子表達(dá)式 X 在 此位置的右側(cè)匹配時(shí)才繼續(xù)匹配。例如,/w+(?=/d) 與后跟數(shù)字的單詞匹配,而不與該數(shù)字匹配。此構(gòu)造不會(huì)回溯。
(?!X)
零寬度負(fù)先行斷言。僅當(dāng)子表達(dá)式 X 不在 此位置的右側(cè)匹配時(shí)才繼續(xù)匹配。例如,例如,/w+(?!/d) 與后不跟數(shù)字的單詞匹配,而不與該數(shù)字匹配 。
(?<=X)
零寬度正后發(fā)斷言。僅當(dāng)子表達(dá)式 X 在 此位置的左側(cè)匹配時(shí)才繼續(xù)匹配。例如,(?<=19)99 與跟在 19 后面的 99 的實(shí)例匹配。此構(gòu)造不會(huì)回溯。
(?
零寬度負(fù)后發(fā)斷言。僅當(dāng)子表達(dá)式 X 不在此位置的左側(cè)匹配時(shí)才繼續(xù)匹配。例如,(?
從斷言的表達(dá)形式可以看出,它用的就是分組符號(hào),只不過(guò)開(kāi)頭都加了一個(gè)問(wèn)號(hào),這個(gè)問(wèn)號(hào)就是在說(shuō)這是一個(gè)非捕獲組,這個(gè)組沒(méi)有編號(hào),不能用來(lái)后向引用,只能當(dāng)做斷言。(對(duì)于正則表達(dá)式的斷言感興趣的同學(xué),可以再查一查資料,這里不多做贅述)
所以這里我們不想匹配abc字符串就得用這個(gè)表達(dá)式: (?!abc)
測(cè)試代碼:
import re
p = re.compile(r'error(?!abc)'
print p.search("errorabc")
print p.search("errorab")
結(jié)果:
None
<_sre.SRE_Match object at 0x7f129ce34b90>
那么我想不匹配"error123bsc"這個(gè)字符串呢?你是不是以為 error.*(?!abc) 這么寫(xiě)這個(gè)正則就可以了,我們來(lái)試試
import re
p = re.compile(r'error.*(?!abc)'
print p.search("error123abc")
結(jié)果:
<_sre.SRE_Match object at 0x7f129ce34bf8>
看,失敗了吧!那怎么寫(xiě)呢?這么寫(xiě):error((?!abc).)*$
知道了(?!abc),那么可以理解((?!abc).)* 的意思就是匹配 不含abc的字符(?!abc) 跟 任意字符. 的組合,出現(xiàn)任何次*
很多人會(huì)問(wèn),"$"不是匹配行末尾么,確實(shí)是這個(gè)意思,不明白請(qǐng)精度上面一句話再來(lái)看正則,然后我們來(lái)測(cè)一下:
import re 無(wú)錫人流醫(yī)院 http://www.0510bhyy.com/
p = re.compile(r'error((?!abc).)*$')
print p.search("error123abc")
print p.search("error123abc123")
print p.search("error123ab123")
結(jié)果:
None
None
<_sre.SRE_Match object at 0x7f129ce81a08>
明白了吧!
以此類(lèi)推,你要是想匹配包含error不包含error前后的abc,那么應(yīng)該是這么寫(xiě)這個(gè)正則:
測(cè)一下:
import re
p = re.compile(r'^((?!abc).)*error((?!abc).)*$')
print p.search("123abc123error123")
print p.search("123ab123error123")
結(jié)果:
None
<_sre.SRE_Match object at 0x7f129ce81a08>
我們要是想匹配包含error不包含多個(gè)字符串,比如abc和def,這么寫(xiě)正則: error((?!(abc|def)).)*$
測(cè)試:
import re
p = re.compile(r'error((?!(abc|def)).)*$')
print p.search("error123abc234")
print p.search("error123ab234")
print p.search("error123def234")
結(jié)果:
None
<_sre.SRE_Match object at 0x7f87973eccf0>
None
測(cè)試完成!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
