筆記 正規表示式 (一)零寬斷言

2021-10-01 08:38:56 字數 981 閱讀 7959

正規表示式有的很難理解,特別是複雜的表示式,看暈了,通過查資料當時記住了,怕以後不知道所以然了,因為前邊學過的或者練習過的,今天想用的時候,突然不知道啦,故從今天開始在部落格上開始記錄開發過程中發現的問題、解決方法、試驗的問題和結果等筆記,原來偶爾記錄一下,覺得有必要記下來,結果沒有必要的後來也不知道啦,故今天開始所以問題必記,也便於他人借鑑:

零寬斷言:分正向和負向零寬斷言,或者是先行斷言和後行斷言,表示匹配字元的時候再新增一些定位條件,使匹配更精準。正規表示式分組分為兩種形式,捕獲組和非捕獲組,零斷言是非捕獲組。

零寬斷言有四種表示式:

1、(?=x) :零寬先行斷言,僅當子表示式 x 在 此位置的右側匹配時才繼續匹配。也就是說要使此零寬度斷言起到我們想要的效果的話,就必須把這個非捕獲組放在整個表示式的右側。

示例字串:s="abc bc b ab"

如:我想要取出字母後面有『c』的『b』字元,,那就用到先行斷言:『b(?=c)',結果有兩個匹配上,abc和bc單詞中的'b'字母。

2、(?!x):先行否定斷言,僅當子表示式 x 不在此位置的右側時才繼續匹配。

如:想取出字母後面的字母不是『c』的'b'字元,就要用到了先行否定斷言:'b(?!c)',結果有兩個,b單詞和ab單詞中的'b'字母

3、(?<=x):零寬後行斷言,僅當子表示式 x 在 此位置的左側匹配時才繼續匹配。

如:想取出字母'b'後面是'c',前面是'a'的'b'字元,就要用到後行斷言和先行斷言:(?<=a)b(?=c),結果只有乙個,'abc'符合匹配規則。

4、(?如:  如:想取出字母'b'後面不是'c',前面不是'a'的'b'字元,就要用到後行否定斷言和先行否定斷言:(?<!a)b(?!c),結果只有乙個,'b'符合匹配規則。

通過先行斷言和後行斷言,取出的是匹配字元,大家也許會問,在乙個很多文字表示式中,它只給我取出了相應的字元,但我不知道是那乙個匹配中的字元,想知道匹配字串,那就要用到re.finditer (reg,string)去獲取,獲取方法在另一篇關於正規表示式中的文章中。

正規表示式 零寬斷言

零寬斷言的意思是 匹配寬度為零,滿足一定的條件 斷言 零寬斷言用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 b 這樣的錨定作用,用於指定乙個位置,這個位置應該滿足一定的條件 即斷言 因此它們也被稱為零寬斷言。斷言用來宣告乙個應該為真的事實。正規表示式中只有當斷言為真時才會...

正規表示式 零寬斷言

今天在codewars.com做練習,遇到乙個正規表示式相關的題目regex password validation 題目很簡單,對字串進行校驗,規則如下 1.長度至少有6位 2.包含小寫字母 3.包含大寫字母 4.包含數字 5.僅由數字和字母組成 對於2.3.4這3個條件,沒辦法寫在乙個正則裡面,...

正規表示式 零寬斷言

接下來的四個用於查詢在某些內容 但並不包括這些內容 之前或之後的東西,也就是說它們像 b 那樣用於指定乙個位置,這個位置應該滿足一定的條件 斷言 因此它們也被稱為零寬斷言。最好還是拿例子來說明吧 exp 也叫零寬度正 先行斷言,它斷言自身出現的位置的後面能匹配表示式exp 比如 b w ing b ...