這是Python的獨立模塊,須要引入。python
import regit
1. 先說re函數正則表達式
re.match(pattern, string, flags=0)數據庫
參數:pattern:匹配的正則表達式;string:要匹配的字符串;flags:標誌位,用於控制正則表達式的匹配方式,如:是否區分大小寫,多行匹配等等,後面細說。app
用法:匹配以xxx開頭的字符串,匹配成功就返回對象,不然返回Noneide
re.search(pattern, string, flags=0)函數
參數同上spa
用法:掃描整個字符串並返回第一個成功的匹配,不然返回Nonecode
差別:re.match只匹配字符串的開始,若是字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。orm
re.sub(pattern, repl, string, count=0, flags=0)
參數:pattern : 正則中的模式字符串;repl : 替換的字符串,也可爲一個函數;string : 要被查找替換的原始字符串;count : 模式匹配後替換的最大次數,默認 0 表示替換全部的匹配。
用法:用於替換字符串中的匹配項。
re.compile(pattern[, flags])
參數說明同上
用法:該函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 和 search() 這兩個函數使用
findall(string[, pos[, endpos]])
參數:string : 待匹配的字符串;pos : 可選參數,指定字符串的起始位置,默認爲 0;endpos : 可選參數,指定字符串的結束位置,默認爲字符串的長度。
用法:在字符串中找到正則表達式所匹配的全部子串,並返回一個列表,若是沒有找到匹配的,則返回空列表。
差別: match 和 search 是匹配一次 findall 匹配全部。
2. flag說明(修飾符,可選標誌)
re.I 忽略大小寫,I表明IGNORECASE
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 取決於當前的本地化設置,L表明LOCALE
re.M 多行模式,使用本標誌後,‘^’和‘$’匹配行首和行尾時,會增長換行符以前和以後的位置,M表明MULTILINE
re.S 使 「.」 特殊字符徹底匹配任何字符,包括換行;沒有這個標誌, 「.」 匹配除了換行符外的任何字符,S表明DOTALL,即等同於re.DOTALL
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫
re.X 爲了增長可讀性,忽略空格和 # 後面的註釋,X表明VERBOSE,等同於re.VERBOSE
注:多個flag同時使用可使用OR(|) 它們來指定,好比re.I | re.L
3. 正則匹配模式
3.1表達式舉例以及‘r’
\\d-\\d\\d-\\d表明1個數字加'-'再加2個數字再加'-'再加1個數字,好比1-22-3
\\d{2}-\\d{3}-\\d{4}表明2個數字加'-'再加3個數字再加'-'再加4個數字,好比12-222-3456
如上,由於\是須要轉義的,所以咱們須要在'\'前再加上'\'表示
用'r'能夠解決,r表示傳入原始字符串,它不包括轉義字符
好比\\d-\\d\\d-\\d=r'\d-\d\d-\d'
3.2 字符分類
\d 0到9的任何數字 ,等價於 [0-9] (記憶方法:digital數字的)
\D 除0到9的數字之外的任何字符,等價於 [^0-9]
\w 任何字母、數字或下劃線字符(能夠認爲是匹配「單詞」字符),等價於'[A-Za-z0-9_]'(記憶方法: word單詞)
\W 除字母、數字和下劃線之外的任何字符 ,等價於 '[^A-Za-z0-9_]'
\s 空格、製表符或換行符(能夠認爲是匹配「空白」字符) ,等價於 [ \f\n\r\t\v] (記憶方法:Space,空格空白)
\S 除空格、製表符和換行符之外的任何字符 ,等價於 [^ \f\n\r\t\v]
3.2語法
經常使用:
^匹配字符串的開頭
$匹配字符串的末尾。
.匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則能夠匹配包括換行符的任意字符。
.*.*的組合能夠匹配全部字符
[...]用來表示一組字符,單獨列出:[amk] 匹配 'a','m'或'k'
[^...]不在[]中的字符:[^abc] 匹配除了a,b,c以外的字符。
()用來表達分組,後面有舉例
*匹配0次或屢次,r'Bat(wo)*man',匹配wo0次或屢次
+匹配1次或屢次r'Bat(wo)+man',匹配wo至少1次或屢次
?可選匹配,r'Bat(wo)?man',匹配wo0次或1次
{}花括號裏的數字表示匹配次數,好比(AB){3},將匹配ABABAB,{AB}{2,4}將匹配ABAB,ABABAB,ABABABAB,(AB){,3}匹配0到3次的AB,(AB){5,}匹配5次或更屢次的AB
|或關係,A | B 表示 A或B
貪心和非貪心模式
所謂貪心模式就是python的正則表達式儘量的匹配最長的字符串,python默認是貪心的,若是須要匹配儘量的最短字符串,在結束的花括號跟着一個問號r'(AB){3,5}'默認會先匹配最長的,r'(AB){3,5}?'默認匹配最短的
舉例:
Greedystr='ABABABABAB' Greedyre=re.compile(r'(AB){3,5}') Greedyre1=re.compile(r'(AB){3,5}?') Greedy_result=Greedyre.search(Greedystr) Greedy_result1=Greedyre1.search(Greedystr) print('默認貪心模式:',Greedy_result.group()) print('修改成非貪心模式:',Greedy_result1.group())
結果:
默認貪心模式: ABABABABAB
修改成非貪心模式: ABABAB
3.3 ()分組,re的group用法
()能夠對錶達式進行分組,咱們可使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式
group(num=0),默認爲0,能夠輸入多個組號
groups()返回一個包含全部小組字符串的元組
舉例說明:
1.沒有分組的狀況
message='My telephone number is 0731-8888-4321, and his is 0733-5678-6666' phonenum=re.compile(r'\d{4}-\d{4}-\d{4}')#編譯正則表達式,\d表明數字,{4}表示匹配的個數爲4,r表明傳入原始字符串 search_result=phonenum.search(message)#search只返回以第一次命中的 findall_result=phonenum.findall(message)#返回全部命中的結果,返回的是列表 print('search的結果:',search_result.group()) print('findall的結果:',findall_result)
#結果:
search的結果: 0731-8888-4321
findall的結果: ['0731-8888-4321', '0733-5678-6666']
2.有分組的狀況,分組用()表示,返回的是元組
message='My telephone number is 0731-8888-4321, and his is 0733-5678-6666' phonenum=re.compile(r'(\d{4})-(\d{4})-(\d{4})')#編譯正則表達式,\d表明數字,{4}表示匹配的個數爲4,分組多了括號(),這裏分了三個組 search_result=phonenum.search(message)#search只返回以第一次命中的 findall_result=phonenum.findall(message)#返回全部命中的結果,返回的是列表 print('search的結果group:',search_result.group(),'search的結果指定group1,2:',search_result.group(1,2)) print('findall的結果:',findall_result)
#結果
search的結果group: 0731-8888-4321 search的結果指定group1,2: ('0731', '8888')
findall的結果: [('0731', '8888', '4321'), ('0733', '5678', '6666')]
3.有分組但匹配中有()的狀況,‘(’要用轉義字符,舉例中電話號碼加了括號
message='My telephone number is (0731)-8888-4321, and his is (0733)-5678-6666' phonenum=re.compile(r'(\(\d{4}\))-(\d{4})-(\d{4})')#編譯正則表達式,\d表明數字,{4}表示匹配的個數爲4,分組多了括號(),這裏分了三個組 search_result=phonenum.search(message)#search只返回以第一次命中的 findall_result=phonenum.findall(message)#返回全部命中的結果,返回的是列表 print('search的結果group:',search_result.group(),'search的結果指定group1,2:',search_result.group(1,2)) print('findall的結果:',findall_result)
#結果
search的結果group: (0731)-8888-4321 search的結果指定group1,2: ('(0731)', '8888')
findall的結果: [('(0731)', '8888', '4321'), ('(0733)', '5678', '6666')]