28Python正则表达式、正则表达式对象、正则表达式修饰符、表达式模板、表达式实例、match函数、search方法、检索和替换、repl、compile、findall等
28Python正則表達式
正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一個字符串是否與某種模式匹配。
Python 自1.5版本起增加了re 模塊,它提供 Perl 風格的正則表達式模式。
re 模塊使 Python 語言擁有全部的正則表達式功能。
compile 函數根據一個模式字符串和可選的標志參數生成一個正則表達式對象。該對象擁有一系列方法用于正則表達式匹配和替換。
re 模塊也提供了與這些方法功能完全一致的函數,這些函數使用一個模式字符串做為它們的第一個參數。
本章節主要介紹Python中常用的正則表達式處理函數。
28.1正則表達式對象
28.1.1re.RegexObject
re.compile() 返回 RegexObject 對象。
28.1.2re.MatchObject
group()返回被RE匹配的字符串
?start()返回匹配結果的位置。
?end()返回匹配結束的位置。
?span()返回一個元組包含匹配(開始,結束)的位置
28.2正則表達式修飾符 - 可選標識
正則表達式可以包含一些可選標志修飾符來控制匹配的模式。修飾符被指定為一個可選的標志。多個標志可以通過按位 OR(|) 它們來指定。如 re.I | re.M 被設置成 I 和 M 標志:
28.3正則表達式模式
模式字符串使用特殊的語法來表示一個正則表達式:
字母和數字表示他們自身。一個正則表達式模式中的字母和數字匹配同樣的字符串。
多數字母和數字前加一個反斜杠時會擁有不同的含義。
標點符號只有被轉義時才匹配自身,否則它們表示特殊的含義。
反斜杠本身需要使用反斜杠轉義。
由于正則表達式通常都包含反斜杠,所以你最好使用原始字符串來表示它們。模式元素(如 r’\t’,等價于 ‘\t’)匹配相應的特殊字符。
下表列出了正則表達式模式語法中的特殊元素。如果你使用模式的同時提供了可選的標志參數,某些模式元素的含義會改變。
28.4正則表達式實例
28.5re.match函數
re.match嘗試從字符串的起始位置匹配一個模式,如果不是起始位置匹配成功的話,match()就返回none.
函數語法:
re.match(pattern, string, flags=0)函數參數說明:
匹配成功re.match方法返回一個匹配的對象,否則返回None。
我們可以使用group(num)或groups()匹配對象函數來獲取匹配表達式。
實例:
以上實例運行輸出結果為:
(0, 3) None實例:
# -*- coding: UTF-8 -*-import re line = "Cats are smarter than dogs"matchObj = re.match(r'(.*) are (.*?) .*',line,re.M | re.I)if matchObj:print("matchObj.group():",matchObj.group())print("matchObj.group(1):",matchObj.group(1))print("matchObj.group(2):",matchObj.group(2)) else:print("No match!!")運行結果:
matchObj.group(): Cats are smarter than dogs matchObj.group(1): Cats matchObj.group(2): smarter28.6re.search()方法
re.search掃描整個字符串并返回第一個成功的匹配。
函數語法:
函數參數說明:
匹配成功re.search方法返回一個匹配的對象,否則返回None。
我們可以使用group(num) 或 groups() 匹配對象函數來獲取匹配表達式。
實例:
以上實例運行輸出結果為:
(0, 3) (11, 14)實例:
# -*- coding: UTF-8 -*-import reline = "Cats are smarter than dogs";searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)if searchObj:print("searchObj.group() : ", searchObj.group())print("searchObj.group(1) : ", searchObj.group(1))print("searchObj.group(2) : ", searchObj.group(2)) else:print("Nothing found!")運行結果:
searchObj.group() : Cats are smarter than dogs searchObj.group(1) : Cats searchObj.group(2) : smarter28.7re.match與re.search的區別
re.match只匹配字符串的開始,如果字符串開始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個字符串,直到找到一個匹配。
# -*- coding: UTF-8 -*-import reline = "Cats are smarter than dogs"matchObj = re.match( r'dogs', line, re.M|re.I) if matchObj:print("match --> matchObj.group():",matchObj.group()) else:print("None match")matchObj = re.search(r'dogs',line,re.M|re.I) if matchObj:print("search --> searchObj.group():",matchObj.group()) else:print("No match!!")28.8檢索和替換
Python的re模塊提供了re.sub用于替換字符串中的匹配項。
語法:
參數:
?pattern : 正則中的模式字符串。
?repl : 替換的字符串,也可為一個函數。
?string : 要被查找替換的原始字符串。
?count : 模式匹配后替換的最大次數,默認 0 表示替換所有的匹配。
實例:
運行結果:
電話號碼是: 2004-959-559 電話號碼是: 200495955928.9repl參數是一個函數
以下實例中將字符串中的匹配的數字乘以2:
# -*- coding: UTF-8 -*-import re# 將匹配的數字乘以 2 def double(matched):value = int(matched.group('value'))return str(value * 2)s = 'A23G4HFD567' print(re.sub('(?P<value>\d+)', double, s))運行結果:
A46G8HFD113428.10re.compile 函數
compile函數用于編譯正則表達式,生成一個正則表達式(Pattern)對象,供match()和search()這兩個函數使用。
語法格式為:
參數:
?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為了增加可讀性,忽略空格和#后面的注釋
實例
在上面,當匹配成功時返回一個Match對象,其中:
?group([group1, …]) 方法用于獲得一個或多個分組匹配的字符串,當要獲得整個匹配的子串時,可直接使用 group() 或 group(0);
?start([group]) 方法用于獲取分組匹配的子串在整個字符串中的起始位置(子串第一個字符的索引),參數默認值為 0;
?end([group]) 方法用于獲取分組匹配的子串在整個字符串中的結束位置(子串最后一個字符的索引+1),參數默認值為 0;
?span([group]) 方法返回 (start(group), end(group))。
28.11findall
在字符串中找到正則表達式所匹配的所有子串,并返回一個列表,如果沒有找到匹配的,則返回空列表。
注意:match和search是匹配一次findall匹配所有。
語法格式為:
參數:
?string:待匹配的字符串
?pos:可選參數,指定字符串的起始位置,默認為0
?endpos:可選參數,指定字符串的結束位置,默認為字符串的長度。
查找字符串中的所有數字:
運行結果:
['123', '456'] ['88', '12']28.12re.finditer
和 findall 類似,在字符串中找到正則表達式所匹配的所有子串,并把它們作為一個迭代器返回。
實例
運行結果:
12 32 43 328.13re.split
split方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下:
re.split(pattern, string[, maxsplit=0, flags=0])參數:
實例:
總結
以上是生活随笔為你收集整理的28Python正则表达式、正则表达式对象、正则表达式修饰符、表达式模板、表达式实例、match函数、search方法、检索和替换、repl、compile、findall等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多林卡被吞了(多林卡)
- 下一篇: 29-30Python多线程、多线程、使