Python3正則表示式(一)基本語法規則
正則表示式是一個很強大的字串處理工具,它能幫助我們方便的檢查一個字串是否與某種模式匹配。
一、python中正則表示式的基本語法規則
序號 | 語法 | 解釋 | 表示式 | 成功匹配物件 |
---|---|---|---|---|
1 | 一般字元 | 匹配自身相對應的字元 | abc | abc |
2 | . | 匹配除換行符(\n)以外的任意字元 | a.c | abc |
3 | \ | 轉義字元,可以改變原字元的意思 | a.c | a.c |
4 | \d | 匹配數字:0~9 | \dabc | 1abc |
5 | \w | 匹配單詞字元,a~z;A~Z;0~9 | \w\w\w | oX2 |
6 | \s | 匹配空格字元(\t,\n,\r,\f,\v) | a\sc | a c |
7 | \D | 匹配非數字字元 | \Dabc | aabc |
8 | \W | 匹配非單詞字元 | a\Wc | a c |
9 | \S | 匹配非空格字元 | \S\Sc | 1bc |
10 | [] | 字符集,對應位置上可以是字符集裡的任意字元 | a[def]c | aec |
11 | [^] | 對字符集當中的內容進行取反 | a[^def]c | a2c |
12 | [a-z] | 指定一個範圍字符集 | a[A-Z]c | aBc |
13 | * | 允許前一個字元可以出現0次或者無限次 | a*b | aaab或b |
14 | + | 前一個字元至少出現1次 | a+b | aaab或ab |
15 | ? | 前一個字元只能出現一次或者不出現 | a?b | ab或b |
16 | {m} | 允許前一個字元只能出現m次 | a{3}b | aaab |
17 | {m,n} | 允許前一個字元至少出現m次,最多出現n次(如果不寫n,則代表至少出現m次) | a{3,5}b和a{3,} | aaaab和aaaaaab |
18 | ^ | 匹配字串的開始,多行內容時匹配每一行的開始 | ^abc | abc |
19 | $ | 匹配字串的結尾,多行內容時匹配每一行的結尾 | abc& | abc |
20 | \A | 匹配字串開始位置,忽略多行模式 | \Aabc | abc |
21 | \Z | 匹配字串結束位置,忽略多行模式 | abc\Z | abc |
22 | \b | 匹配位於單詞開始或結束位置的空字串 | hello \bworld | hello world |
23 | \B | 匹配不位於單詞開始或結束位置的空字串 | he\Bllo | hello |
24 | | | 表示左右表示式任意滿足一種即可 | abc|cba | abc或cba |
25 | (…) | 將被括起來的表示式作為一個分組,可以使用索引單獨取出 | (abc)d | abcd |
26 | (?P<name>…) | 為該分組起一個名字,可以用索引或名字去除該分組 | (?P<id>abc)d | abcd |
27 | \number | 引用索引為number中的內容 | (abc)d\1 | abcdabc |
28 | (?P=name) | 引用該name分組中的內容 | (?P<id>abc)d(?P=id) | abcdabc |
29 | (?:…) | 分組的不捕獲模式,計算索引時會跳過這個分組 | (?:a)b(c)d\1 | abcdc |
30 | (?iLmsux) | 分組中可以設定模式,iLmsux之中的每個字元代表一個模式,單獨介紹 | (?i)abc | Abc |
31 | (?#…) | 註釋,#後面的內容會被忽略 | ab(?#註釋)123 | ab123 |
32 | (?=…) | 順序肯定環視,表示所在位置右側能夠匹配括號內正則 | a(?=\d) | a1最後的結果得到a |
33 | (?!…) | 順序否定環視,表示所在位置右側不能匹配括號內正則 | a(?!\w) | a c最後的結果得到a |
34 | (?<=…) | 逆序肯定環視,表示所在位置左側能夠匹配括號內正則 | 1(?<=\w)a | 1a |
35 | (?<!…) | 逆序否定環視,表示所在位置左側不能匹配括號內正則 | 1 (?<!\w)a | 1 a |
36 | (?(id/name)yes|no) | 如果前面的索引為id或者名字為name的分組匹配成功則匹配yes區域的表示式,否則匹配no區域的表示式,no可以省略 | (\d)(?(1)\d|a) | 32 |
二、(?iLmsux)為分組設定模式
這裡的”i”, “L”, “m”, “s”, “u”, “x”,它們不匹配任何字串,而是表示對應python中re模組當中的(re.I, re.L, re.M, re.S, re.U, re.X)的6種選項。
可以在python原始碼中看到:
I = IGNORECASE # 忽略大小寫
L = LOCALE # 字符集本地化,為了支援多語言版本的字符集使用環境
U = UNICODE # 使用\w,\W,\b,\B這些元字元時將按照UNICODE定義的屬性
M = MULTILINE # 多行模式,改變 ^ 和 $ 的行為
S = DOTALL # '.' 的匹配不受限制,包括換行符
X = VERBOSE # 冗餘模式,可以忽略正則表示式中的空白和#號的註釋
六種模式在正則表示式中可以同時使用多個的,在 python 裡面使用按位或運算子 | 同時新增多個模式
如:re.compile(”, re.I|re.M|re.S)
三 、反斜槓的使用
在一般的程式語言當中,反斜槓“\”代表反轉義字元,在反斜槓後面加一個字元可以表示一種特定的意思,接下來列舉幾個常見的轉義字元:
序號 | 轉義字元 | 解釋 |
---|---|---|
1 | \f | 換頁,將當前位置移到下頁開頭 |
2 | \n | 換行,將當前位置移到下一行開頭 |
3 | \r | 回車,將當前位置移到本行開頭 |
4 | \t | 水平製表,跳到下一個TAB位置 |
5 | \v | 垂直製表(暫時還沒用過這個) |
6 | \\ | 代表一個反斜槓字元 ‘\’ |
因為在正則表示式的規則當中,‘\’就是轉義字元的意思,前面基本語法規則裡也有說到,但是在一般的變成語言中,’\’也有轉義字元的意思,所以,如果我們要是寫程式碼的時候用到正則表示式中的’\’的時候,就需要寫四個’\’,才可以代表一個真正的反斜槓字元,如:“\\\\”。
“\\\\”:這裡的第一個和第三個是在程式語言中起轉義的作用,結果:“\\”,然後在正則表示式中它在進行一次反轉義就代表著一個真正的反斜槓字元了。
但是在python語言中,我們可以不考慮這個問題。只需要在寫好的字串前面加一個’r’, 告訴編譯器這個字串是個原生字串,不要轉義’\’ 。
例如,上個例子中的正則表示式可以使用r”\”表示。因為加上這個’r’,只是告訴python語言不轉義這個字串,但是在正則表示式中還是要符合正則表示式的規則。同樣,匹配一個數字的”\d”就可以寫成r”\d”。所以,在python中寫正則表示式時,要養成一個前面寫’r’的習慣。
四、總結
這些就是正則表示式的基本語法了,和學習程式設計一樣,活學活用,不懂就查。接下來將寫一下在python3中使用正則表示式即re模組的學習筆記。