正規表示式 分組 零寬斷言

2021-10-08 14:58:52 字數 2051 閱讀 1594

import re

a ='123.123.123.aaa.aaa.aaa'

reg =

'(\d)(.\\1).(\w)(.\\3)'

res = re.search(reg,a)

print

(res)

#

引用分組上例中\\1代表引用第乙個分組\d\\3代表引用第三個分組\w

import re

a ='123.234.345.456'

b ='123.123.123.123'

reg =

'(\d)(.\\1)'

resa = re.search(reg,a)

resb = re.search(reg,b)

print

(resa,

'\n'

,resb)

'''輸出

none

'''

引用文字內容由上例,後向引用,引用的僅僅是文字內容,而不是正規表示式也就是說,組中的內容一旦匹配成功,後向引用,引用的就是匹配成功後的內容,引用的是結果,而不是表示式。

分組編號規律

無論括號如何巢狀,分組的編號都是根據開括號出現的順序來計數的;開括號是從左至右數起第多少個開括號,分組編號就是多少。如下圖:

指明某個字串前邊或者後邊,將會出現滿足某種規律的字串

如:(?<=).*(?=) 或者 (?<=).*(?=)

a =

'這裡是標題內容'

reg =

'(?<=).*(?=)'

# 或# reg = '(?<=).*(?=)'

resa = re.search(reg,a)

print

(resa)

#

:匹配 中國人的「人」而不匹配 外國人的「人」

b =

'外國人中國人'

reg1 =

'(?reg2 =

'人'res1 = re.search(reg1,b)

res2 = re.search(reg2,b)

print

(res1,

'\n'

,res2)

'''輸出

'''

:匹配 中國製造的「中國」

b =

'中國生產中國製造'

reg1 =

'中國(?!生產)'

res1 = re.search(reg1,b)

print

(res1)

'''輸出

'''

如同^代表開頭,$代表結尾,\b代表單詞邊界一樣,先行斷言和後行斷言也有類似的作用,它們只匹配某些位置,在匹配過程中,不占用字元,所以被稱為「零寬」。所謂位置,是指字串中(每行)第乙個字元的左邊、最後乙個字元的右邊以及相鄰字元的中間(假設文字方向是頭左尾右)

理解

關於先行(lookahead)和後行(lookbehind)

正規表示式引擎在執行字串和表示式匹配時,會從頭到尾(從前到後)連續掃瞄字串中的字元,設想有乙個掃瞄指標指向字元邊界處並隨匹配過程移動。先行斷言,是當掃瞄指標位於某處時,引擎會嘗試匹配指標還未掃過的字元,先於指標到達該字元,故稱為先行。後行斷言,引擎會嘗試匹配指標已掃過的字元,後於指標到達該字元,故稱為後行。

關於正向(positive)和負向(negative)

正向就表示匹配括號中的表示式,負向表示不匹配。

正規表示式 零寬斷言

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

正規表示式 零寬斷言

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

正規表示式 零寬斷言

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