1. 程式人生 > >day22 正則表示式 re

day22 正則表示式 re

1.  正則表示式
     正則表示式是對字串操作的一種邏輯公式. 我們一般使用正則表示式
對字串進行匹配和過濾.
   工: 各大文字編輯器⼀般都有正則匹配功能. 我們也可以去
http://tool.chinaz.com/regex/進行線上測試.
   正則表示式由普通字元和元字元組成. 普通字元包含大小寫字母, 數字. 在匹配普通字元
的時候我們直接寫就可以了. 比如"abc" 匹配的就是"abc". 我們如果用python也可以實現相
同的效果. 所以普通字元沒什麼好說的. 重點在元字元上.
   元字元: 元字元才是正則表示式的靈魂. 元字元中的內容太多了, 在這裡我們只介紹⼀些
常用的.
    
1. 字元組
字元組很簡單用[]括起來. []中出現的內容會被匹配. 例如:[abc] 匹配abc
如果字元組中的內容過多還可以使用- , 例如: [a-z] 匹配az之間的所有字母 [0-9]
匹配所有阿拉伯數字 .

    2. 簡單元字元 (這裡只介紹基本的幾個)
. 匹配除換⾏符以外的任意字元
\w 匹配字⺟或數字或下劃線
\s 匹配任意的空字元 \d 匹配數字
\n 匹配一個換行符
\t 匹配一個製表符
\b 匹配一個單詞的結尾
^ 匹配字串的開始
$ 匹配字串的結尾
\W 匹配除字母或數字或下劃線
\D 匹配非數字
\S 匹配非空白符
a|b 匹配字元a或字元b
() 匹配括號內的表示式,也表示一個組
[...]
匹配字元組中的字元
[^...] 匹配除了字元組中字元的所有字元
    
3. 量詞
我們到目配的所有內容都是單一的字元. 那如何匹配很多個字元呢,
我們用到量詞.
* 重複零次或更多次
+ 重複⼀次或更多次
? 重複零次或⼀次
{n} 重複n
{n,} 重複n次或更多次
{n,m} 重複nm

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模組