python進階之正則表達式
- 2020 年 1 月 20 日
- 筆記
概念:
正則表達式是對字元串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個「規則字元串」,這個「規則字元串」用來表達對字元串的一種過濾邏輯。
目的?
給定一個正則表達式和另一個字元串,我們可以達到如下的目的:
1. 給定的字元串是否符合正則表達式的過濾邏輯(稱作「匹配」)。
2. 可以通過正則表達式,從字元串中獲取我們想要的特定部分。
符號:
正則表達試由一些普通字元和一些元字元(metacharacters)組成。普通字元包括大小寫的字母和數字,而元字元則具有特殊的含義,我下面會給予解釋。在最簡單的情況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字元,它可以匹配"testing"和"testing123"等字元串,但是不能匹配"Testing"。要想真正的用好正則表達式,正確的理解元字元是最重要的事情。下表列出了所有的元字元和對它們的一個簡短的描述。
正則 |
待匹配字元 |
匹配結果 |
說明 |
---|---|---|---|
[0123456789] |
8 |
True |
在一個字元組裡枚舉合法的所有字元,字元組裡的任意一個字元和"待匹配字元"相同都視為可以匹配 |
[0123456789] |
a |
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 |
匹配數字 |
n |
匹配一個換行符 |
t |
匹配一個製表符 |
b |
匹配一個單詞的結尾 |
^ |
匹配字元串的開始 |
$ |
匹配字元串的結尾 |
W |
匹配非字母或數字或下劃線 |
D |
匹配非數字 |
S |
匹配非空白符 |
a|b |
匹配字元a或字元b |
() |
匹配括弧內的表達式,也表示一個組 |
[…] |
匹配字元組中的字元 |
[^…] |
匹配除了字元組中字元的所有字元 |
量詞:
量詞 |
用法說明 |
---|---|
* |
重複零次或更多次(貪婪匹配) |
+ |
重複一次或更多次(貪婪匹配) |
? |
重複零次或一次 |
{n} |
重複n次 |
{n,} |
重複n次或更多次 |
{n,m} |
重複n到m次 |
這邊推薦一個驗證正則表達式的一個工具 http://tool.chinaz.com/regex/
接下來大家可以使用上面的工具來測試下面說的實例
實例:
1.匹配任意數字
[0123456789]—abc123def456隻要一個字元串中包含數字,都會被匹配到
2.匹配任意小寫字母
[a-z] —-abc123def456隻要字元串中包含任意小寫字元,都會被匹配
3.匹配任意大寫字母
[A-Z] —-ABC123DEF456隻要字元串中包含任意大寫字元,都會被匹配
4.匹配數字+小寫字母+大寫字母
[0-9A-Za-z] —-ABCabc123DEF456隻要字元串中包含數字小寫大寫字母都回匹配
5.w 與 W與 [wW](匹配所有字元)



6.s 與 S 與 [sS](匹配所有字元)



7.d 與 D 與 [dD](匹配所有字元)



8.n 與 t(tab製表符) 與 b



9.^(匹配一個字元串的開頭) 與 $


(匹配以[a-z]開頭,以[a-z]結尾的字元串,這裡只能匹配2個字元的字元串,因為[]代表一個字元組)
10.a|b(從左向右匹配,優先匹配a)



(左邊匹配了,右邊不會再匹配)
11.[^…]


組合練習:
*+?{}
待匹配字元串 |
正則表達式 |
匹配結果 |
說明 |
---|---|---|---|
小李和小王和小亮 小李和小王王和小亮亮亮 |
[^和]+ |
小李小王小亮 小李小王王小亮亮亮 |
匹配非'和'的所有字元串多次 |
小李和小王王和小亮亮亮 |
[^和]{2,4} |
小李小王王小亮亮亮 |
匹配非『和』的所有字元串2到4次 |
小李和小王王和小亮亮亮 |
[^和]{2,4}? |
小李小王小亮亮亮 |
匹配非『和』的所有字元串2次 |
小李和小王王和小亮亮亮 |
小.? |
小李小王小亮 |
匹配小後面任意字元0次或1次 |
小李和小王王和小亮亮亮 |
小.* |
小李和小王王和小亮亮亮 |
匹配小後面任意字元0次或多次 |
小李和小王王和小亮亮亮 |
小.+ |
小李和小王王和小亮亮亮 |
匹配小後面任意字元一次或多次 |
小李和小王王和小亮亮亮 |
小.{1,2} |
小李和小王王小亮亮 |
匹配小後面任意字元一次到2次 |
小李和小王王和小亮亮亮 |
小.*? |
小小小 |
匹配小後面任意字元0次(因為有?限制,表示匹配最少的頁就是0次即什麼都不匹配) |
字符集[] [^]
待匹配字元串 |
正則表達式 |
匹配結果 |
說明 |
---|---|---|---|
小李和小王王和小亮亮亮 |
小[李王王亮亮亮]* |
小李小王王小亮亮亮 |
匹配小後面字元組裡面任意字元0次或多次 |
小李和小王王和小亮亮亮 |
小[^和]* |
小李小王王小亮亮亮 |
匹配小後面非和子的任意字元0次或多次 |
123abc345 |
[d] |
1 2 3 3 4 5 |
匹配任意一個數字 |
123abc345 |
[d]* |
123 345 |
匹配任意多個數字 |
123abc345 |
[d]+ |
123 345 |
匹配任意多個數字 |
分組()與或 | [^]
匹配15位或18位身份證,15位需都是數字組成,18位可以是數字或x結尾,首位都不能為0
待匹配字元串 |
正則表達式 |
匹配結果 |
說明 |
---|---|---|---|
110621199012014599 |
^[1-9]d{13,16}[0-9x]$ |
110621199012014599 |
可以匹配到一個正確的身份證,但是如果是16位1106211990120145也同樣能匹配到,但是這並不是身份證 |
|
^[1-9]d{14}(d{2}[0-9x])?$ |
|
不會再匹配錯誤的身份證(你可以試試的) |
110621199012014599 |
^([1-9]d{16}[0-9x]|[1-9]d{14})$ |
110621199012014599 |
這個是比較好的表達式,先匹配18位,再匹配15位 |
總結:
要想熟練的使用正則表達式,還是要多練多寫吧! 希望大家能像計算1+1=2這麼簡單的使用正則表達式