正規表示式的一些基礎(一)

2021-07-24 20:06:13 字數 4323 閱讀 1279

1  常見字元範圍縮寫

對於一些常用的字元範圍,如數字等,由於非常常用,即使使用[0-9]這樣的字元組仍顯得麻煩,所以定義了一些元字元,來表示常見的字元範圍。

表示式說明

\d任意乙個數字,相當於[0-9],即0~9 中的任意乙個

\w任意乙個字母或數字或下劃線,相當於[a-za-z0-9_]

\s任意空白字元,相當於[ \r\n\f\t\v]

\d任意乙個非數字字元,\d取反,相當於[^0-9]

\w\w取反,相當於[^a-za-z0-9_]

\s任意非空白字元,\s取反,相當於[^ \r\n\f\t\v]

舉例:

\w\s\d

」在匹配「windows 2003」時,匹配成功,匹配的結果為「s 2」。

2  小數點

小數點可以匹配除「\n」以外的任意乙個字元。如果要匹配包括「\n」在內的所有字元,一般用[\s\s],或者是用「.」加(?s)匹配模式來實現。

表示式說明

.匹配除了換行符 \n 以外的任意乙個字元

3  其它元字元

表示式說明^

匹配字串開始的位置,不匹配任何字元

$匹配字串結束的位置,不匹配任何字元

\b匹配單詞邊界,不匹配任何字元

舉例:

^a

」在匹配「cba」時,匹配失敗,因為表示式要求開始位置後面是字元「a」,而「cba」顯然是不滿足的。 「

\d$

」在匹配「123」時,匹配成功,匹配結果為「3」,這個表示式要求匹配結尾處的數字,如果結尾處不是數字,如「123abc」,則是匹配失敗的。

4  轉義字元

一些不可見字元,或是在正則中具有特殊意義的元字元,如想匹配字元本身,需要用「\」對其進行轉義。

表示式說明\r,\n

回車和換行

\\匹配「\」本身

\^,\$,\.

分別匹配「^」、「$」和「.」

以下字元在匹配其本身時,通常需要進行轉義。在實際應用中,根據具體情況,需要轉義的字元可能不止如下所列字元

.  $  ^  

表示式匹配m次

「\d」相當於「\d\d\d 」

「(abc)」相當於「abcabc」

表示式匹配最少m次,最多n次

「\d」可以匹配「12」或「321」等2到3位的數字

表示式至少匹配m次

「[a-z]」表示至少8位以上的字母

?表示式匹配0次或1次,相當於

「ab?」可以匹配「a」或「ab」

*表示式匹配0次或任意多次,相當於

「<[^>]*>」中「[^>]*」表示0個或任意多個不是「>」的字元

+表示式匹配1次或意多次,至少1次,相當於

「\d\s+\d」表示兩個數字中間,至少有乙個以上的空白字元

注意:在不是動態生成的正規表示式中,不要出現「」這樣的量詞,如「\w」在結果上等價於「\w」,但是會降低匹配效率和可讀性,屬於畫蛇添足的做法。

6  分支結構(alternation)

當乙個字串的某一子串具有多種可能時,採用分支結構來匹配,「|」表示多個子表示式之間「或」的關係,「|」是以()限定範圍的,如果在「|」的左右兩側沒有()來限定範圍,那麼它的作用範圍即為「|」左右兩側整體。

表示式說明

|多個子表示式之間取「或」的關係

舉例:

^aa|b$

」在匹配「cccb」時,是可以匹配成功的,匹配的結果是「b」,因為這個表示式表示匹配「^aa」或「b」,而

「b」在匹配「cccb 」時是可以匹配成功的。 「

^(aa|b)$

」在區配「cccb」時,是匹配失敗的,因為這個表示式表示在「開始」和「結束」位置之間只能是「aa」或「b」,而「cccb」顯然是不滿足的。

正則難點

1 捕獲組(capture group)

捕獲組就是把正規表示式中子表示式匹配的內容,儲存到記憶體中以數字編號或手動命名的組裡,以供後面引用。

表示式說明

(expression)

普通捕獲組,將子表示式expression匹配的內容儲存到以數字編號的組裡

(?expression)

命名捕獲組,將子表示式expression匹配的內容儲存到以name命名的組裡

普通捕獲組(在不產生歧義的情況下,簡稱捕獲組)是以數字進行編號的,編號規則是以「(」從左到右出現的順序,從1開始進行編號。通常情況下,編號為0的組表示整個表示式匹配的內容。

命名捕獲組可以通過捕獲組名,而不是序號對捕獲內容進行引用,提供了更便捷的引用方式,不用關注捕獲組的序號,也不用擔心表示式部分變更會導致引用錯誤的捕獲組。

2 非捕獲組

一些表示式中,不得不使用( ),但又不需要儲存( )中子表示式匹配的內容,這時可以用非捕獲組來抵消使用( )帶來的***。

表示式說明

(?:expression)

進行子表示式expression的匹配,並將匹配內容儲存到最終的整個表示式的區配結果中,但expression匹配的內容不單獨儲存到乙個組內

3 反向引用

捕獲組匹配的內容,可以在正規表示式的外部程式中進行引用,也可以在表示式中進行引用,表示式中引用的方式就是反向引用。

反向引用通常用來查詢重複的子串,或是限定某一子串成對出現。

表示式說明

\1,\2

對序號為1和2的捕獲組的反向引用

\k對命名為name的捕獲組的反向引用

舉例:

(a|b)\1

」在匹配「abaa」時,匹配成功,匹配到的結果是「aa」。「(a|b)」在嘗試匹配時,雖然既可以匹配「a」,也可以匹配「b」,但是在進行反向引用時,對應()中匹配的內容已經是固定的了。

4    環視(look around)

環視只進行子表示式的匹配,匹配內容不計入最終的匹配結果,是零寬度的。

環視按照方向劃分有順序和逆序兩種,按照是否匹配有肯定和否定兩種,組合起來就有四種環視。環視相當於對所在位置加了乙個附加條件。

表示式說明(?<=expression)

逆序肯定環視,表示所在位置左側能夠匹配expression

(?逆序否定環視,表示所在位置左側不能匹配expression

(?=expression)

順序肯定環視,表示所在位置右側能夠匹配expression

(?!expression)

順序否定環視,表示所在位置右側不能匹配expression

舉例:

(?<=windows )\d+

」在匹配「windows 2003」時,匹配成功,匹配結果為「2003」。我們知道「\d+」表示匹配乙個以上的數字,而「(?<=windows )」相當於乙個附加條件,表示所在位置左側必須為「windows 」,它所匹配的內容並不計入匹配結果。同樣的正則在匹配「office 2003」時,匹配失敗,因為這裡任意一串數字子串的左側都不是「windows 」。 「

(?!1)\d+」在匹配「123

」時,匹配成功,匹配的結果為「23」。「\d+」匹配乙個以上數字,但是附加條件「(?!1)」要求所在位置右側不能是「1」,所以匹配成功的位置是「2」前面的位置。

5 忽略優先和匹配優先

或者叫做正規表示式匹配的貪婪與非貪婪模式。

標準量詞修飾的子表示式,在可匹配可不匹配的情況下,總會先嘗試進行匹配,稱這種方式為匹配優先,或者貪婪模式。此前介紹的一些量詞,「」、「」、「」、「?」、「*」和「+」都是匹配優先的。

一些nfa正則引擎支援忽略優先量詞,也就是在標準量詞後加乙個「?」,此時,在可匹配可不匹配的情況下,總會先忽略匹配,只有在由忽略優先量詞修飾的子表示式,必須進行匹配才能使整個表示式匹配成功時,才會進行匹配,稱這種方式為忽略優先,或者非貪婪模式。忽略優先量詞包括「?」、「?」、「?」、「??」、「*?」和「+?」。

舉例:源字串:aaa

bbb正規表示式1:

.*

匹配結果:aaa

bbb正規表示式2:

.*?

匹配結果:aaa

一些正規表示式

要嚴格的驗證手機號碼,必須先要清楚現在已經開放了哪些數字開頭的號碼段,目前國內號碼段分配如下 移動 134 135 136 137 138 139 150 151 157 td 158 159 187 188 聯通 130 131 132 152 155 156 185 186 電信 133 153...

一些正規表示式

判斷是否是正整數if isnan paramvalue paramvalue 0 else 金額的格式判斷輸入金額的要求 整數字最多十位,小數為最多為兩位,可以無小數字 0 9 1 9 0 9 0 9 function checkmoney str 0 9 if re.test str else 手...

一些正規表示式

記錄一下 以防忘記 string hello 123 4567 world this is a regsssss res re.match w s d s d s w string 匹配到 hello 123 4567 world this 其中 代表乙個字串的開始 代表乙個字串的結尾 w 匹配字母...