正則表達式描述了一種字符串匹配的模式。正則表達式
a. 數據驗證數組
驗證手機號,銀行卡號等。緩存
b. 替換文本app
正則查找特定源文本,將其替換爲目標文本。this
c. 提取子串spa
從給定字符串中提取目標子串。字符串
\s 匹配任何單個空白字符,包括tab鍵和換行符。編譯
\S 匹配任何非空白字符。語法
\w 匹配包括[a-zA-Z0-9_]。(大小寫英文字母、數字、下劃線)引用
\W 匹配任何非\w中的字符。(除了大小寫英文字母、數組、下劃線以外的特殊字符)
\d 匹配包括[0-9]的數字。
\D 匹配任何非\d的數字。
$ 匹配字符串的結束位置,若設置了匹配的多行屬性,$也匹配\n,\r。
^ 匹配字符串的開始位置。
() 標記子表達式的開始和結束。
+ 匹配前面的子表達式1次或屢次。
* 匹配前面的子表達式0次或屢次。
? 匹配前面的子表達式0次或1次。
\ 將下一個字符標記爲或特殊字符,或原義字符,或反向引用。例如:\n匹配換行符,\1表示同前面的括號子表達式。
. 匹配除了換行符\n以外的任意單字符。
| 標記兩項之間的選擇。
[ 方括號表達式的開始標記。
{ 標記限定表達式的開始。
限制匹配次數。
* 匹配前面的子表達式0次或屢次。
+ 匹配前面的子表達式1次或屢次。
? 匹配前面的子表達式0次或1次。
{n} 準確匹配,匹配前面的子表達式n次。
{n,} 匹配前面的子表達式至少n次。
{n,m} 匹配前面的子表達式,至少n次,至多m次。
例:對於正則 [a-z]+,若對字符串abcde匹配,則會盡量匹配最長的結果,即貪婪匹配,匹配結果爲:abcde。如果對abcde使用正則[a-z]+?匹配,則會匹配最短知足條件的結果,爲a
$ 標記字符串的開始。
^ 標記字符串的結尾。
\b 匹配一個單詞的邊界。即單詞與空格之間的位置。
例如:
/\bHel/ 能夠匹配 "Hello World",可是不能匹配"Haahel World",由於Hel須要出如今單詞的開頭。
/Hel\b/ 沒法匹配"Hello World",可是能夠匹配"ollHel World",由於Hel須要出如今單詞的末尾。
\B 匹配非單詞的邊界。
例如:
/\BHel/ 能夠匹配 "HaaHelooo World",也能夠匹配 "oooHelHello World",可是不能匹配"Hello World",由於Hel匹配單詞的非邊界。
所以,\B非單詞邊界運算符,與位置無關,匹配不關心是在單詞的開頭仍是結尾。
用圓括號將一些項括起來,相鄰選擇項之間用 | 分隔。可是使用圓括號有一個缺點,就是相關的匹配會被緩存,此時能夠用?:加在第一個選項的前面,從而消除這種反作用。
例如:匹配AABA格式的字符串,且將A提取出來,定義正則="(\w)\1(?:\w)\1",能夠知足要求。
就是對前面出現的分組進行再一次引用。反向引用最有用的應用就是匹配字符串中重複出現的內容。
例如:匹配AA形式的字符串,定義正則="(\w)\1",使用反向表達式\1表示引用前面的子表達式\w,而不用重複寫,尤爲在正則表達式比較繁雜的時候更有效。
re.compile(pattern, flags)能夠編譯正則表達式,其中flags是以下一些常量參數,若是要設置多個,能夠用|分隔,例如:re.compile(r"^abc(\d)898$", re.I|re.M),表示不區分大小寫,而且採用多行匹配。
r 表示原字符串的意思,不用加轉義字符。
re.I ignorecase,表示不區分大小寫。
re.M multiline,表示多行匹配。
例:this (is) a (happy) day 的意思是:匹配 this is a happy day,而且有兩個字模式匹配 is 與 happy,而且這兩個子模式的匹配會存儲下來。
例:this (?:is) a (?:happy) day 的意思是:匹配 this is a happy day,而且有兩個字模式匹配 is 與 happy,可是這兩個子模式的匹配不存儲。
例:hello(?=world) 的意思是:匹配hello,且後面緊跟的是world。
例:[0-9a-z]{2}(?!aa) 的意思是:匹配2個字符,且後面緊跟的不是aa。
例:a(?!a) 的意思是:匹配a,且a後面跟的不是a。
例:(?<=hello)world 的意思是:匹配world,且world前面是hello。
例:(?<!hello)world 的意思是:匹配world,且world前面不是hello。