正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。python中使用re模塊進行正則表達式處理。
compile 函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象。
語法格式為:
compile(pattern, flags=0):
參數:
pattern : 一個字符串形式的正則表達式
flags 可選,表示匹配模式,比如忽略大小寫,多行模式等,具體參數為:
re.I 忽略大小寫
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前環境
re.M 多行模式
re.S 即為' . '並且包括換行符在內的任意字符(' . '不包括換行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依賴於 Unicode 字符屬性數據庫
re.X 為了增加可讀性,忽略空格和' # '后面的注釋
1、re.match函數
re.match 嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none。
1 import re 2 3 def retest(): 4 pattern = re.compile('12345') 5 m = pattern.match('123459588j 12345kjjh328898890-8hghddd11234').span() #在起始位置匹配,返回匹配位置 6 print(m) 7 m1 = pattern.match('847jhdfkad12345') #不在起始位置匹配,返回None 8 print(m1)
group()可以提取匹配的子字符串,比如:匹配字符串r'(.*) are (.*?) .*'定義了兩個分組
1 import re 2 3 def retest(): 4 if matchObj: 5 print("matchObj.group() : ", matchObj.group()) #提取整個匹配字符串 6 print("matchObj.group(1) : ", matchObj.group(1)) #提取第一個分組匹配字符串, 即:are 之前的匹配表達式 7 print("matchObj.group(2) : ", matchObj.group(2)) #提取第一個分組匹配字符串,即:are 之后的匹配表達式 8 else: 9 print("No match!!")
2、re.search方法
re.search 掃描整個字符串並返回第一個成功的匹配。
函數語法:
search(pattern, string, flags=0)
1 import re 2 3 def retest(): 4 pattern = re.compile('12345') 5 m = pattern.search('123459588j 12345kjjh328898890-8hghddd11234') #在起始位置匹配,返回匹配位置 6 print(m) 7 m1 = pattern.search('847jhdfkad12345') #不在起始位置匹配,返回匹配位置 8 print(m1)
re.match與re.search的區別
re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。
3、re.sup方法
re.sub用於替換字符串中的匹配項。
語法:
sub(pattern, repl, string, count=0, flags=0)
參數:
- pattern : 正則中的模式字符串。
- repl : 替換的字符串,也可為一個函數。
- string : 要被查找替換的原始字符串。
- count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。
- flags : 編譯時用的匹配模式,數字形式。
1 import re 2 a = 'foot' 3 b = re.sub('oo','ooo',a) #返回替換后的字符串 4 print(b)
替換字符串也可以是函數
1 import re 2 3 # 將匹配的數字乘於 2 4 def double(matched): 5 value = int(matched.group('value')) 6 return str(value * 2) 7 8 s = 'A23G4HFD567' 9 print(re.sub('(?P<value>\d+)', double, s))
4、re.findall方法
在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。
注意: match 和 search 是匹配一次 findall 匹配所有。
語法格式為:
findall(pattern, string, flags=0)
參數:
- string 待匹配的字符串。
- pos 可選參數,指定字符串的起始位置,默認為 0。
- endpos 可選參數,指定字符串的結束位置,默認為字符串的長度。
1 import re 2 3 def retest(): 4 pattern = re.compile('\d+') #查找數字 5 num = re.findall(pattern,'3dhfdiuhdkjfh9844948h5320') #返回查找結果列表 6 print(num)
5、re.finditer方法
和 findall 類似,在字符串中找到正則表達式所匹配的所有子串,並把它們作為一個迭代器返回。
1 import re 2 3 it = re.finditer(r"\d+","12a32bc43jf3") 4 for match in it: 5 print (match.group() )
6、re.split方法
split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:
1 import re 2 3 def retest(): 4 aa = re.split('\d+','3u9389kdjfkdsjfdl384339') #以數字進行分割 5 print(aa)
正則表達式模式
模式字符串使用特殊的語法來表示一個正則表達式:
字母和數字表示他們自身。一個正則表達式模式中的字母和數字匹配同樣的字符串。
多數字母和數字前加一個反斜杠時會擁有不同的含義。
標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。
反斜杠本身需要使用反斜杠轉義。
由於正則表達式通常都包含反斜杠,所以你最好使用原始字符串來表示它們。模式元素(如 r'\t',等價於 \\t )匹配相應的特殊字符。
下表列出了正則表達式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標志參數,某些模式元素的含義會改變。
模式 | 描述 |
---|---|
^ | 匹配字符串的開頭 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字符。 |
[...] | 用來表示一組字符,單獨列出:[amk] 匹配 'a','m'或'k' |
[^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
re* | 匹配0個或多個的表達式。 |
re+ | 匹配1個或多個的表達式。 |
re? | 匹配0個或1個由前面的正則表達式定義的片段,非貪婪方式 |
re{ n} | 匹配n個前面表達式。例如,"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的兩個o。 |
re{ n,} | 精確匹配n個前面表達式。例如,"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o。"o{1,}"等價於"o+"。"o{0,}"則等價於"o*"。 |
re{ n, m} | 匹配 n 到 m 次由前面的正則表達式定義的片段,貪婪方式 |
a| b | 匹配a或b |
(re) | 匹配括號內的表達式,也表示一個組 |
(?imx) | 正則表達式包含三種可選標志:i, m, 或 x 。只影響括號中的區域。 |
(?-imx) | 正則表達式關閉 i, m, 或 x 可選標志。只影響括號中的區域。 |
(?: re) | 類似 (...), 但是不表示一個組 |
(?imx: re) | 在括號中使用i, m, 或 x 可選標志 |
(?-imx: re) | 在括號中不使用i, m, 或 x 可選標志 |
(?#...) | 注釋. |
(?= re) | 前向肯定界定符。如果所含正則表達式,以 ... 表示,在當前位置成功匹配時成功,否則失敗。但一旦所含表達式已經嘗試,匹配引擎根本沒有提高;模式的剩余部分還要嘗試界定符的右邊。 |
(?! re) | 前向否定界定符。與肯定界定符相反;當所含表達式不能在字符串當前位置匹配時成功。 |
(?> re) | 匹配的獨立模式,省去回溯。 |
\w | 匹配數字字母下划線 |
\W | 匹配非數字字母下划線 |
\s | 匹配任意空白字符,等價於 [\t\n\r\f]。 |
\S | 匹配任意非空字符 |
\d | 匹配任意數字,等價於 [0-9]。 |
\D | 匹配任意非數字 |
\A | 匹配字符串開始 |
\Z | 匹配字符串結束,如果是存在換行,只匹配到換行前的結束字符串。 |
\z | 匹配字符串結束 |
\G | 匹配最后匹配完成的位置。 |
\b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
\B | 匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
\n, \t, 等。 | 匹配一個換行符。匹配一個制表符, 等 |
\1...\9 | 匹配第n個分組的內容。 |
\10 | 匹配第n個分組的內容,如果它經匹配。否則指的是八進制字符碼的表達式。 |