溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用python正則表達(dá)式解決包含且不包含某字符串的問(wèn)題

發(fā)布時(shí)間:2021-08-06 18:35:37 來(lái)源:億速云 閱讀:385 作者:chen 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“怎么用python正則表達(dá)式解決包含且不包含某字符串的問(wèn)題”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么用python正則表達(dá)式解決包含且不包含某字符串的問(wèn)題”吧!

  本測(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ò)開頭都加了一個(gè)問(wèn)號(hào),這個(gè)問(wèn)號(hào)就是在說(shuō)這是一個(gè)非捕獲組,這個(gè)組沒有編號(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) 這么寫這個(gè)正則就可以了,我們來(lái)試試

  import re

  p = re.compile(r'error.*(?!abc)'

  print p.search("error123abc")

  結(jié)果:

  <_sre.SRE_Match object at 0x7f129ce34bf8>

  看,失敗了吧!那怎么寫呢?這么寫: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>

  明白了吧!

  以此類推,你要是想匹配包含error不包含error前后的abc,那么應(yīng)該是這么寫這個(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,這么寫正則: 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è)試完成!

到此,相信大家對(duì)“怎么用python正則表達(dá)式解決包含且不包含某字符串的問(wèn)題”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI