python 正則表達式

正則表達式描述了一種字符串匹配的模式。正則表達式

1 爲何要使用正則表達式

a. 數據驗證數組

驗證手機號,銀行卡號等。緩存

b. 替換文本app

正則查找特定源文本,將其替換爲目標文本。this

c. 提取子串spa

從給定字符串中提取目標子串。字符串

2 正則表達式-語法

\s  匹配任何單個空白字符,包括tab鍵和換行符。編譯

\S  匹配任何非空白字符。語法

\w  匹配包括[a-zA-Z0-9_]。(大小寫英文字母、數字、下劃線)引用

\W  匹配任何非\w中的字符。(除了大小寫英文字母、數組、下劃線以外的特殊字符)

\d  匹配包括[0-9]的數字。

\D 匹配任何非\d的數字。

a. 特殊字符

$  匹配字符串的結束位置,若設置了匹配的多行屬性,$也匹配\n,\r。

^  匹配字符串的開始位置。 

()  標記子表達式的開始和結束。

+  匹配前面的子表達式1次或屢次。

*  匹配前面的子表達式0次或屢次。

?  匹配前面的子表達式0次或1次。

\  將下一個字符標記爲或特殊字符,或原義字符,或反向引用。例如:\n匹配換行符,\1表示同前面的括號子表達式。

.  匹配除了換行符\n以外的任意單字符。

|  標記兩項之間的選擇。

[  方括號表達式的開始標記。

{  標記限定表達式的開始。

b. 限定符

限制匹配次數。

*  匹配前面的子表達式0次或屢次。

+  匹配前面的子表達式1次或屢次。

?  匹配前面的子表達式0次或1次。

{n}  準確匹配,匹配前面的子表達式n次。

{n,}  匹配前面的子表達式至少n次。

{n,m}  匹配前面的子表達式,至少n次,至多m次。

*和+限定符都是貪婪的,它們儘量多的匹配字符。只有在它們後面加一個?,就能實現非貪婪或最小匹配。

例:對於正則 [a-z]+,若對字符串abcde匹配,則會盡量匹配最長的結果,即貪婪匹配,匹配結果爲:abcde。如果對abcde使用正則[a-z]+?匹配,則會匹配最短知足條件的結果,爲a

c. 定位符

$  標記字符串的開始。

^  標記字符串的結尾。

\b  匹配一個單詞的邊界。即單詞與空格之間的位置。

例如:

/\bHel/  能夠匹配 "Hello World",可是不能匹配"Haahel World",由於Hel須要出如今單詞的開頭。

/Hel\b/ 沒法匹配"Hello World",可是能夠匹配"ollHel World",由於Hel須要出如今單詞的末尾。

\B  匹配非單詞的邊界。

例如:

/\BHel/  能夠匹配 "HaaHelooo World",也能夠匹配 "oooHelHello World",可是不能匹配"Hello World",由於Hel匹配單詞的非邊界。

所以,\B非單詞邊界運算符,與位置無關,匹配不關心是在單詞的開頭仍是結尾。

3 選擇

圓括號將一些項括起來,相鄰選擇項之間用 | 分隔。可是使用圓括號有一個缺點,就是相關的匹配會被緩存,此時能夠用?:加在第一個選項的前面,從而消除這種反作用。

例如:匹配AABA格式的字符串,且將A提取出來,定義正則="(\w)\1(?:\w)\1",能夠知足要求。

4 反向引用

就是對前面出現的分組進行再一次引用。反向引用最有用的應用就是匹配字符串中重複出現的內容。

例如:匹配AA形式的字符串,定義正則="(\w)\1",使用反向表達式\1表示引用前面的子表達式\w,而不用重複寫,尤爲在正則表達式比較繁雜的時候更有效。

5 re模塊

re.compile(pattern, flags)能夠編譯正則表達式,其中flags是以下一些常量參數,若是要設置多個,能夠用|分隔,例如:re.compile(r"^abc(\d)898$", re.I|re.M),表示不區分大小寫,而且採用多行匹配。

r 表示原字符串的意思,不用加轉義字符。

re.I  ignorecase,表示不區分大小寫。

re.M multiline,表示多行匹配。

6 捕獲組與非捕獲組(正向預查,反向預查)

(pattern) 捕獲組,表示匹配pattern而且捕獲匹配結果。

例:this (is) a (happy) day  的意思是:匹配 this is a happy day,而且有兩個字模式匹配 is 與 happy,而且這兩個子模式的匹配會存儲下來。

(?:pattern) 非捕獲組,匹配pattern可是不須要捕獲匹配結果。消耗字符。

例:this (?:is) a (?:happy) day  的意思是:匹配 this is a happy day,而且有兩個字模式匹配 is 與 happy,可是這兩個子模式的匹配不存儲。

(?=pattern) 非捕獲組,正向確定預查。lookahead,在任何匹配pattern的字符串開始處匹配查找字符串,匹配結果不存儲,預查不消耗字符。

例:hello(?=world)  的意思是:匹配hello,且後面緊跟的是world。

(?!pattern) 非捕獲組,正向否認預查。lookahead,在任何不匹配pattern的字符串開始處匹配查找字符串,匹配結果不存儲,預查不消耗字符。

例:[0-9a-z]{2}(?!aa)  的意思是:匹配2個字符,且後面緊跟的不是aa。

例:a(?!a)  的意思是:匹配a,且a後面跟的不是a。

(?<=pattern) 非捕獲組,反向確定預查。lookbehind,與正向確定預查相似,只是方向相反。pattern中不能有+,*等不定長度的量詞。預查不消耗字符。

例:(?<=hello)world  的意思是:匹配world,且world前面是hello。

(?<!pattern) 非捕獲組,反向否認預查。lookbehind,與正向否認預查相似,只是方向相反。pattern中不能有+,*等不定長度的量詞。預查不消耗字符。

例:(?<!hello)world  的意思是:匹配world,且world前面不是hello。

7 實例解析

a. 檢測密碼強度

  • 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在 8-10 之間):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$。使用了正向確定預查,可使用.*,且預查不消耗字符。
  • 強密碼(必須包含大小寫字母和數字的組合,可使用特殊字符,長度在 8-10 之間):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$。使用了正向確定預查,可使用.*,且預查不消耗字符。
相關文章
相關標籤/搜索