Python的正則表達式(一)

這是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')]

相關文章
相關標籤/搜索