day22 正則表示式 re
阿新 • • 發佈:2018-11-16
1. 正則表示式 正則表示式是對字串操作的一種邏輯公式. 我們一般使用正則表示式
對字串進行匹配和過濾.
工具: 各大文字編輯器⼀般都有正則匹配功能. 我們也可以去
http://tool.chinaz.com/regex/進行線上測試.
正則表示式由普通字元和元字元組成. 普通字元包含大小寫字母, 數字. 在匹配普通字元
的時候我們直接寫就可以了. 比如"abc" 匹配的就是"abc". 我們如果用python也可以實現相
同的效果. 所以普通字元沒什麼好說的. 重點在元字元上.
元字元: 元字元才是正則表示式的靈魂. 元字元中的內容太多了, 在這裡我們只介紹⼀些
常用的.
1. 字元組
字元組很簡單用[]括起來. 在[]中出現的內容會被匹配. 例如:[abc] 匹配a或b或c
如果字元組中的內容過多還可以使用- , 例如: [a-z] 匹配a到z之間的所有字母 [0-9]
匹配所有阿拉伯數字 .
2. 簡單元字元 (這裡只介紹基本的幾個)
. 匹配除換⾏符以外的任意字元
\w 匹配字⺟或數字或下劃線
\s 匹配任意的空字元 \d 匹配數字
\n 匹配一個換行符
\t 匹配一個製表符
\b 匹配一個單詞的結尾
^ 匹配字串的開始
$ 匹配字串的結尾
\W 匹配除字母或數字或下劃線
\D 匹配非數字
\S 匹配非空白符
a|b 匹配字元a或字元b
() 匹配括號內的表示式,也表示一個組
[...]匹配字元組中的字元
[^...] 匹配除了字元組中字元的所有字元
3. 量詞
我們到目配的所有內容都是單一的字元. 那如何匹配很多個字元呢,
我們用到量詞.
* 重複零次或更多次
+ 重複⼀次或更多次
? 重複零次或⼀次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次
4. 惰性匹配和貪婪匹配
在量詞中的*, +,{} 都屬於貪婪匹配. 就是儘可能多的匹配到結果
------------------------------------------
例.1
str: 麻花藤昨天讓英雄聯盟關服了
reg: 麻花藤.*
此時匹配的是整句話 ------------------------------------------
str: 麻花藤昨天讓英雄聯盟關服了
reg: 麻花藤.*?
此時匹配的是 麻花藤
str: <div>胡辣湯</div>
reg: <.*>
結果: <div>胡辣湯</div>
str: <div>胡辣湯</div>
reg: <.*?>
結果<div>
</div>
str: <div>胡辣湯</div>
reg: <(div|/div*)?>
結果:
<div>
</div> --------------------------------------------
.*?x的特殊含義 找到下⼀個x為⽌.
str: abcdefgxhijklmn
reg: .*?x
結果:abcdefgx
-----------------------------------------
5.分組
在正則中使用()進行分組. 比如. 我們要匹配⼀個相對復雜的身份證號. 身份證號分
成兩種. 老的身份證號有15位. 新的身份證號有18位. 並且新的身份證號結尾有可能是x.
給出以下正則:請判斷那些符合要求
^[1-9]\d{13,16}[0-9x]$
^[1-9]\d{14}(\d{2}[0-9x])?$
^([1-9]\d{16}[0-9x]|[1-9]\d{14})$
6. 轉義
在正則表示式中, 有很多有特殊意義的是元字元, 比如\n和\s等,如果要在正則中匹
配正常的"\n"⽽不是"換行符"就需要對"\"進⾏轉義, 變成'\\'.在python中, ⽆論是正則表示式, 還
是待匹配的內容, 都是以字串的形式出現的, 在字串中\也有特殊的含義, 本身還需要轉
義. 所以如果匹配⼀次"\n", 字串中要寫成'\\n', 那麼正則⾥就要寫成"\\\\n",這樣就太麻煩了.
這個時候我們就⽤到了r'\n'這個概念, 此時的正則是r'\\n'就可以了
----------------------------------------------
2. re模組