字符組
字符組:[字符組],在同一個位置可能出現的各類字符組成了一個字符組,在正則表達式中用[]表示字符分爲不少類,好比數字、字母、標點等等。
假如一個位置"只能出現一個數字",那麼這個位置上的字符只能是0、一、2...9這10個數之一。在線測試工具
正則html |
待匹配字符python |
匹配 結果正則表達式 |
說明工具 |
[0123456789]測試 |
8spa |
Truecode |
在一個字符組裏枚舉合法的全部字符,字符組裏的任意一個字符 和"待匹配字符"相同都視爲能夠匹配htm |
[0123456789]blog |
aip |
False |
因爲字符組中沒有"a"字符,因此不能匹配 |
[0-9] |
7 |
True |
也能夠用-表示範圍,[0-9]就和[0123456789]是一個意思 |
[a-z] |
s |
True |
一樣的若是要匹配全部的小寫字母,直接用[a-z]就能夠表示 |
[A-Z] |
B |
True |
[A-Z]就表示全部的大寫字母 |
[0-9a-fA-F] |
e |
True |
能夠匹配數字,大小寫形式的a~f,用來驗證十六進制字符 |
|
經常使用元字符
代碼 |
說明 |
. |
匹配除換行符之外的任意字符 |
\w |
匹配字母或數字或下劃線 |
\s |
匹配任意的空白符 |
\d |
匹配數字 |
\b |
匹配單詞的開始或結束 |
^ |
匹配字符串的開始 |
$ |
匹配字符串的結束 |
a|b |
匹配字符a或b |
() |
匹配括號內的表達式,也表示一個組 |
|
\s所指的空白符包括space \t 以及\n
\b*匹配以*開頭的單詞,*\b則匹配以*結尾的單詞
. ^ $
正則 |
待匹配字符 |
匹配 結果 |
說明 |
海. |
海燕海嬌海東 |
海燕海嬌海東 |
匹配全部"海."的字符 |
^海. |
海燕海嬌海東 |
海燕 |
只從開頭匹配"海." |
海.$ |
海燕海嬌海東 |
海東 |
只匹配結尾的"海.$" |
|
經常使用限定符
代碼/語法 |
說明 |
* |
重複零次或更屢次 |
+ |
重複一次或更屢次 |
? |
重複零次或一次 |
{n} |
重複n次 |
{n,} |
重複n次或更屢次 |
{n,m} |
重複n到m次 |
|
* + ? { }
正則 |
待匹配字符 |
匹配 結果 |
說明 |
李.? |
李傑和李蓮英和李二棍子 |
李傑 李蓮 李二 |
?表示重複零次或一次,即只匹配"李" 後面一個任意字符 |
李.* |
李傑和李蓮英和李二棍子 |
李傑和李蓮英和李二棍子 |
*表示重複零次或屢次,即匹配"李" 後面0或多個任意字符 |
李.+ |
李傑和李蓮英和李二棍子 |
李傑和李蓮英和李二棍子 |
+表示重複一次或屢次,即只匹配"李" 後面1個或多個任意字符 |
李.{1,2} |
李傑和李蓮英和李二棍子 |
李傑和 李蓮英 李二棍 |
{1,2}匹配1到2次任意字符 |
|
注意:前面的*,+,?等都是貪婪匹配,也就是儘量匹配,後面加?號使其變成惰性匹配
正則 |
待匹配字符 |
匹配 結果 |
說明 |
李.*? |
李傑和李蓮英和李二棍子 |
李 李 李 |
惰性匹配 |
|
經常使用反義詞
代碼/語法 |
說明 |
\W |
匹配任意不是字母,數字,下劃線,漢字的字符 |
\S |
匹配任意不是空白符的字符 |
\D |
匹配任意非數字的字符 |
\B |
匹配不是單詞開頭或結束的位置 |
[^x] |
匹配除了x之外的任意字符 |
[^aeiou] |
匹配除了aeiou這幾個字母之外的任意字符 |
|
[ ] 只要出如今中括號內的內容均可以被匹配
[^] 只要不出如今中括號中的內容均可以被匹配
有一些有特殊意義的元字符進入字符組中會回覆它原本的意義 : . | [ ] ( )
字符集[][^]
正則 |
待匹配字符 |
匹配 結果 |
說明 |
李[傑蓮英二棍子]* |
李傑和李蓮英和李二棍子 |
李傑 李蓮英 李二棍子 |
表示匹配"李"字後面[傑蓮英二棍子]的字符任意次 |
李[^和]* |
李傑和李蓮英和李二棍子 |
李傑 李蓮英 李二棍子 |
表示匹配一個不是"和"的字符任意次 |
[\d] |
456bdha3 |
4 5 6 3 |
表示匹配任意一個數字,匹配到4個結果 |
[\d]+ |
456bdha3 |
456 3 |
表示匹配任意個數字,匹配到2個結果 |
|
分組 ()與 或 |[^]
身份證號碼是一個長度爲15或18個字符的字符串,若是是15位則所有🈶️數字組成,首位不能爲0;若是是18位,則前17位所有是數字,末位多是數字或x,下面咱們嘗試用正則來表示:
正則 |
待匹配字符 |
匹配 結果 |
說明 |
^[1-9]\d{13,16}[0-9x]$ |
110101198001017032 |
110101198001017032 |
表示能夠匹配一個正確的身份證號 |
^[1-9]\d{13,16}[0-9x]$ |
1101011980010170 |
1101011980010170 |
表示也能夠匹配這串數字,但這並非一個正確 的身份證號碼,它是一個16位的數字 |
^[1-9]\d{14}(\d{2}[0-9x])?$ |
1101011980010170 |
False |
如今不會匹配錯誤的身份證號了 ()表示分組,將\d{2}[0-9x]分紅一組,就能夠 總體約束他們出現的次數爲0-1次 |
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$ |
110105199812067023 |
110105199812067023 |
表示先匹配[1-9]\d{16}[0-9x]若是沒有 匹配上就匹配[1-9]\d{14} |
|
轉義符
在正則表達式中,有不少有特殊意義的是元字符,好比\d和\s等,若是要在正則中匹配正常的"\d"而不是"數字"就須要對"\"進行轉義,變成'\\'。
在python中,不管是正則表達式,仍是待匹配的內容,都是以字符串的形式出現的,在字符串中\也有特殊的含義,自己還須要轉義。因此若是匹配一次"\d",字符串中要寫成'\\d',那麼正則裏就要寫成"\\\\d",這樣就太麻煩了。這個時候咱們就用到了r'\d'這個概念,此時的正則是r'\\d'就能夠了。
貪婪匹配
貪婪匹配:在知足匹配時,匹配儘量長的字符串,默認狀況下,採用貪婪匹配
正則 |
待匹配字符 |
匹配 結果 |
說明 |
<.*> |
<script>...<script> |
<script>...<script> |
默認爲貪婪匹配模式,會匹配儘可能長的字符串 |
<.*?> |
r'\d' |
<script> <script> |
加上?爲將貪婪匹配模式轉爲非貪婪匹配模式,會匹配儘可能短的字符串 |
|
*? 重複任意次,但儘量少重複
+? 重複1次或更屢次,但儘量少重複
?? 重複0次或1次,但儘量少重複
{n,m}? 重複n到m次,但儘量少重複
{n,}? 重複n次以上,但儘量少重複
. 是任意字符
* 是取 0 至 無限長度
? 是非貪婪模式。
何在一塊兒就是 取儘可能少的任意字符,通常不會這麼單獨寫,他大多用在:
.*?x
就是取前面任意長度的字符,直到一個x出現
文章來源:女神的博客