在一般的后端語言中都有正則表達(dá)式的使用,,個人覺得正則表達(dá)式的難點就是有比較多的元字符比較難記,,所以建議大家收藏。而在 python 的編程中,,特別是爬蟲之后的數(shù)據(jù)篩選,、清洗等操作都需要對字符串進(jìn)行大量的操作,使用正則表達(dá)式無疑是最簡便的一種字符串處理操作,。
1,、正則表達(dá)式的元字符及組裝形式
首先,正則表達(dá)式就是由一個一個的元字符組合起來的一個字符串,,然后以這個字符串作為格式去匹配任意的字符串最后生成新的數(shù)據(jù)文本,。那么,先來看一下在 python 中像這樣的元字符到底有哪些,。 1. 匹配任意字符(不包括換行符) 2^ 匹配開始位置,,多行模式下匹配每一行的開始 3$ 匹配結(jié)束位置,多行模式下匹配每一行的結(jié)束 4* 匹配前一個元字符0到多次 5+ 匹配前一個元字符1到多次 6? 匹配前一個元字符0到1次 7{m,n} 匹配前一個元字符m到n次 8\\ 轉(zhuǎn)義字符,,跟在其后的字符將失去作為特殊元字符的含義,,例如\\.只能匹配.,不能再匹配任意字符 9[] 字符集,,一個字符的集合,,可匹配其中任意一個字符 10| 邏輯表達(dá)式 或 ,比如 a|b 代表可匹配 a 或者 b 11(...) 分組,,默認(rèn)為捕獲,,即被分組的內(nèi)容可以被單獨取出,默認(rèn)每個分組有個索引,,從 1 開始,,按照"("的順序決定索引值 12(?iLmsux) 分組中可以設(shè)置模式,iLmsux之中的每個字符代表一個模式,用法參見 模式 I 13(?:...) 分組的不捕獲模式,,計算索引時會跳過這個分組 14(?P<name>...) 分組的命名模式,,取此分組中的內(nèi)容時可以使用索引也可以使用name 15(?P=name) 分組的引用模式,可在同一個正則表達(dá)式用引用前面命名過的正則 16(?#...) 注釋,不影響正則表達(dá)式其它部分,用法參見 模式 I 17(?=...) 順序肯定環(huán)視,,表示所在位置右側(cè)能夠匹配括號內(nèi)正則 18(?!...) 順序否定環(huán)視,,表示所在位置右側(cè)不能匹配括號內(nèi)正則 19(?<=...) 逆序肯定環(huán)視,表示所在位置左側(cè)能夠匹配括號內(nèi)正則 20(?<!...) 逆序否定環(huán)視,,表示所在位置左側(cè)不能匹配括號內(nèi)正則 21(?(id/name)yes|no) 若前面指定id或name的分區(qū)匹配成功則執(zhí)行yes處的正則,否則執(zhí)行no處的正則 22\number 匹配和前面索引為number的分組捕獲到的內(nèi)容一樣的字符串 23\A 匹配字符串開始位置,,忽略多行模式 24\Z 匹配字符串結(jié)束位置,,忽略多行模式 25\b 匹配位于單詞開始或結(jié)束位置的空字符串 26\B 匹配不位于單詞開始或結(jié)束位置的空字符串 27\d 匹配一個數(shù)字, 相當(dāng)于 [0-9] 28\D 匹配非數(shù)字,相當(dāng)于 [^0-9] 29\s 匹配任意空白字符,, 相當(dāng)于 [ \t\n\r\f\v] 30\S 匹配非空白字符,,相當(dāng)于 [^ \t\n\r\f\v] 31\w 匹配數(shù)字、字母,、下劃線中任意一個字符,, 相當(dāng)于 [a-zA-Z0-9_] 32\W 匹配非數(shù)字、字母,、下劃線中的任意字符,,相當(dāng)于 [^a-zA-Z0-9_]
來源說明:以上元字符表說明引用自“博客園,菜鳥的日?!?/p>
2,、python 的內(nèi)置模塊 re 操作正則表達(dá)式的模式
python 的 re 模塊提供了很多內(nèi)置的函數(shù)來操作正則表達(dá)式,掌握正則表達(dá)式以及這些函數(shù)的使用會更大的提高工作效率,,因為大多時候都是在和字符串打交道,。并且 re 模塊在使用這些函數(shù)來操作正則表達(dá)式的時候都可以指定不同類型的模式。比如:re 內(nèi)置模塊的 compile(pattern, flags=0) 函數(shù)中的 flags 參數(shù)就是用于指定匹配模式的,,默認(rèn)情況下各個內(nèi)置函數(shù)的模式都等于零就是不指定模式,。1re.I 使匹配對大小寫不敏感 2re.L 做本地化識別(locale-aware)匹配 3re.M 多行匹配,影響 ^ 和 $ 4re.S 使 . 匹配包括換行在內(nèi)的所有字符 5re.U 根據(jù)Unicode字符集解析字符,。這個標(biāo)志影響 \w, \W, \b, \B. 6re.X 該標(biāo)志通過給予你更靈活的格式以便你將正則表達(dá)式寫得更易于理解,。
3、re 模塊函數(shù)匹配正則表達(dá)式操作字符串
compile(pattern, flags=0) 對匹配的正則表達(dá)式進(jìn)行預(yù)編譯,,這種模式有利于后續(xù)對同一種匹配規(guī)則的復(fù)用,,當(dāng)然也可以不進(jìn)行預(yù)編譯使用 re 模塊的內(nèi)置函數(shù)直接進(jìn)行正則表達(dá)式的使用。 findall(pattern, string, flags=0) 找到所有的匹配以后的數(shù)據(jù),,并且使用列表的形式返回匹配后的數(shù)據(jù),。 1# 導(dǎo)入 re 內(nèi)置模塊 2import re 3# 定義多行字符串 sc 4sc = '''str1 5str2 6str3''' 7 8# 使用 compile() 函數(shù)進(jìn)行正則表達(dá)式對預(yù)編譯 9# 其中正則表達(dá)式為<.+>參照元字符表,表達(dá)式中<.>表示匹配任意字符(不包括換行符) 10# <+> 表示匹配前一個元字符1到多次,,組合<.+>就表示匹配所有字符不包括換行符 11pattern = re.compile(".+") 12# 正則表達(dá)對象調(diào)用 findall() 函數(shù)返回列表 13print pattern.findall(sc) 14# 打印返回列表,,結(jié)果應(yīng)該是下面列表 15['str1', 'str2', 'str3']
split(pattern, string, maxsplit=0, flags=0) 按照正則表達(dá)式匹配的數(shù)據(jù)為切割點,對原來的數(shù)據(jù)進(jìn)行切分并返回一個數(shù)據(jù)列表。1# 定義原始字符串 2sc = '''strw 1 laow 3 strd 2 laow 4 strc 3 laow''' 5# 按照數(shù)字切分 6print re.split('\d+', sc) 7# 打印結(jié)果 8['strw ', ' laow\n strd ', ' laow\n strc ', ' laow']
sub(pattern, repl, string, count=0, flags=0) 匹配正則表達(dá)式的字符串并且替換成指定的字符串后返回,。 1# 導(dǎo)入內(nèi)置模塊 re 2import re 3# 定義原始字符串 4sc = "the sum of 6 and 9 is [6+9]." 5# 將[6+9]替換為15 6print re.sub('\[6\+9\]', '15', sc) 7# 打印結(jié)果 8the sum of 7 and 9 is 15.
search(pattern, string, flags=0) 查找正則表達(dá)式內(nèi)容,。 1# 導(dǎo)入內(nèi)置模塊 re 2import re 3# 定義原始數(shù)據(jù) 4sc = '''strw 1 laow 5 strd 2 laow 6 strc 3 laow''' 7# 找到第一個以 t 開頭的字符串 8sc_res = re.search('t\w+', sc) 9# 必須使用返回對象的 group() 函數(shù)才能打印出值,因為 search() 函數(shù)返回的是對象 10print sc_res.group()
escape(pattern) 字符串的轉(zhuǎn)義函數(shù),,當(dāng)需要處理的字符串中包含正則表達(dá)式中的元字符時必須對原正則表達(dá)式進(jìn)行轉(zhuǎn)義,,否則會導(dǎo)致匹配不正確。 1# 導(dǎo)入內(nèi)置模塊 re 2import re 3# 定義原始字符串 4sc = ".+\d222" 5# 將正則表達(dá)式<.+\d222>進(jìn)行轉(zhuǎn)義 6pattern_str = re.escape(".+\d222") 7# 打印轉(zhuǎn)移后的正則表達(dá)式 8print pattern_str 9# 打印結(jié)果 10\.\+\\d222 11# 打印匹配后的字符串 12print re.findall(pattern_str, sc) 13# 打印結(jié)果 14['.+\\d222']
除了上述第三點中列舉的常見內(nèi)置函數(shù)的使用,,還有關(guān)于 python 內(nèi)置的正則表達(dá)式的用法還有分組、環(huán)視等使用方法,。能夠幫助我們處理字符串的大多數(shù)問題,,正則表達(dá)式在 python 中的使用非常強大、也是后端語言中使用比較高的,,建議大家收藏,。
|