疫情期間,為了打發無聊時間,決定還是起床來和大家聊一聊正則表達式re模塊。正則表達式是一款強大的字符串處理工具,比如在爬蟲中起到了巨大的作用,程序員不可能用肉眼去排查與之匹配的字符串,所以正則表達式這個時候就發揮了巨大的作用。之前我也是對正則表達式一竅不通,特反感計算機中的一些特殊的符號,根本原因是記不住,太多了。但是為了能夠更好的學習Python,只能埋頭苦幹的學。在用代碼演示之前,先和大家聊一下正則表達式模塊的一些比較注意的地方以及容易混淆的知識點。
我們在Python中使用正則表達式的時候需要導入re模塊,先看一下這張四維導圖瞭解一下re模塊中的功能函數。
<code>正則表達式匹配常用的知識點: . 默認模式下,匹配除換行符(\n)之外的所有單個字符。在S(DOTALL)模式下,匹配所有單個字符。 [字符] 匹配[]內的任意一個字符。[]中可以是單個字符,如[x9k],也可以是一個字符區間,如[a-k],[3-5]。如果需要匹配“-”,可以使用“\-”轉義,或者將該字符置於[]的兩端,如[-axk]或[axk-]。如果需要匹配“]”,可以使用“\]”轉義,或者將該字符置於[]的最前端,如[]axk]。 [^字符] 匹配不在[]內的任意一個字符,[]的取反匹配。 \d 如果是str類型,匹配Unicode十進制數字,這包括但不限於0 ~ 9,例如0,?等字符,也能夠匹配成功。如果是bytes類型,匹配[0-9]。 \D 匹配非Unicode數字字符,\d的取反匹配。 \s 如果是str類型,匹配Unicode空白符,這包括但不限於[空格\t\v\r\n\f]。如果是bytes類型,匹配[空格\t\v\r\n\f]。 \S 匹配非Unicode空白字符,\s的取反匹配。 \w 如果是str類型,匹配Unicode單詞字符,這包括但不限於[a-zA-Z0-9_]。如果是bytes類型,則匹配[a-zA-Z0-9_]。 \W 匹配非Unicode單詞字符,\w的取反匹配。 \ 轉義字符,對正則表達式的特殊字符進行轉義,例如,如果要匹配普通的“.”字符,則可以使用“\.”。 次數相關: * 匹配前面的字符0次或多次。 + 匹配前面的字符1次或多次。 ? 匹配前面的字符0次或1次。 {m} 匹配前面的字符m次。 {m,} 匹配前面的字符至少m次。 {,n} 匹配前面的字符至多n次。 {m,n} 匹配前面的字符m到n次。 X? X表示以上的任意一種模式({m}除外),即在對應的模式字符串後面加上一個問號?,表示該模式的非貪婪模式(否則為貪婪模式)。貪婪模式與非貪婪模式的區別在於:貪婪模式會盡可能匹配最多的字符,而非貪婪模式會盡可能匹配最少的字符。 邊界相關 ^ 匹配字符串的開頭。在多行模式下,可以匹配每一行的開頭。 $ 匹配字符串的結尾。在多行模式下,可以匹配每一行的末尾。 \A 僅匹配字符串的開頭。 \Z 僅匹配字符串的末尾。 \b 匹配單詞的邊界。單詞可以含有Unicode字符、數字與下劃線組成(\w+匹配的內容)。\b匹配的是空串,該空串可以出現在\w(\W)與\W(\w)之間、字符串開頭與\w之間或\w與字符串結尾之間。 \B 匹配單詞的非邊界。\B匹配的是空串,該空串必須出現在兩個\w之間。\B是\b的取反匹配。 組相關: () 對()內的字符進行分組。分組後,該組匹配的內容可以單獨提取,同時,也可以在模式字符串後面使用\number進行引用。 \number number用來指定組序號,序號從1開始。用來匹配number對應的分組內容。 (?:表達式) 匹配()內的字符,但是不會進行分組。()內匹配的內容也無法單獨提取,或者在後面使用\number引用。 (?P表達式) 對()內的字符進行分組,組名為name,多個組之間的名稱不能重複。分組後,該組匹配的內容可以單獨提取,同時,也可以在模式字符串後面使用(?P=name)或\number進行引用。對比之前()進行的序號分組,此種方式可以稱為命名分組。不過,命名分組依然也可以使用序號(\number)進行引用。 (?P=name) 用來匹配同名的分組內容【之前使用(?P)進行的分組】。 | 用來連接兩個並列的模式字符串,匹配其中的一個即可。 /<code>
由於這次所寫的代碼比較多,所以分別分開來寫代碼塊。
- re.compile功能函數:
<code>''' 正則表達式re模塊之compile()函數 Author cmdback 僅限於學習交流,有什麼不妥之處,請與我聯繫,謝謝!!! ''' print('**********開始我們的re.compile學習之旅********') ''' re.compile():編譯正則表達式模式,說的通俗一點就是把平時常用的正則表達式編譯成正則表達式對象,然後調用的時候效率 比較高。 格式: re.compile(pattern,flags=0) pattern指的是需要編譯的正則表達式 flags指的是編譯標誌位,用於修改正則表達式匹配的方式,比如是否區分與之匹配字符的大小寫等 常用的flags: re.S-->使.匹配換行在內的所有字符 re.L-->本地化識別匹配 re.I-->大小寫不敏感,不影響輸出結果 re.M-->多行匹配,會影響^和$ re.X-->是正則表達式的格式更易於理解 re.U-->這個是根據Unicode字符集來解析字符。會影響\w\W\B\b ''' import re def re_compile(): #定義一個字符串 str_1 = 'This a very nice dog,This is very cool and so On......' #將會打印出包含o的所有單詞的匹配項 cc = re.compile(r'\w*o\w') print(cc.findall(str_1)) print("添加標誌位的輸出結果!") #添加標誌位,忽略大消息 bb = re.compile(r'\w*o\w',re.I) print(bb.findall(str_1)) re_compile() **********************輸出結果************************** E:\anaconda\python.exe D:/coder/python代碼/正則.py **********開始我們的re.compile學習之旅******** ['dog', 'cool'] 添加標誌位的輸出結果! ['dog', 'cool', 'On']/<code>
- re.sub()功能函數
<code>''' 正則表達式re模塊之sub()函數 Author cmdback 僅限於學習交流,有什麼不妥之處,請與我聯繫,謝謝!!! ''' import re #re.sub()格式:re.sub(pattern,repl,sting,count) def re_sub(): #此函數功能主要是匹配需要替換的字符,然後返回替換後的新的字符串 str_1 = 'This is a dog' #將空格字符替換成***,然後再返回替換後的新的字符串 print(re.sub(r'\s','***',str_1)) re_sub() **********************輸出結果************************** E:\anaconda\python.exe D:/coder/python代碼/正則_sub.py This***is***a***dog /<code>
- re.subn
<code>''' 正則表達式re模塊之subn()函數 Author cmdback 僅限於學習交流,有什麼不妥之處,請與我聯繫,謝謝!!! ''' import re #re.subn()返回替換的次數,語法格式:re.subn(pattern,replace,string,count=0,flags=0) #定義一個字符串 str_1 = '1234567abcfhgfff123cndhfyr' print(re.subn(r'[7]','####',str_1)) **********************輸出結果************************** E:\anaconda\python.exe D:/coder/python代碼/正則_subn.py ('123456####abcfhgfff123cndhfyr', 1) #在原始字符串中有1個元素是7,所以後面匹配的是數量1./<code>
- re.split
<code>''' 正則表達式re模塊之subn()函數 Author cmdback 僅限於學習交流,有什麼不妥之處,請與我聯繫,謝謝!!! ''' import re #re.split(),按照能夠匹配的字符串分割後返回一個新的字符串,說的可能有點繞,直接上代碼 #以空格為切割點進行劃分,並以列表的形式進行返回 print(re.split(r'\s','This is a cat')) #以數字為切割點,匹配1次或多次。 print(re.split('\d+','abc123cdb45dnjh')) **********************輸出結果************************** E:\anaconda\python.exe D:/coder/python代碼/正則_split.py ['This', 'is', 'a', 'cat'] ['abc', 'cdb', 'dnjh']/<code>
- re.findall
re.findall():遍歷匹配,將字符串中所有與之匹配的都返回到終端,並以列表的形式返回。這個是在編程中常用的,大家一定要記住這個函數的使用方法。
<code>''' 正則表達式re模塊之findall()函數 Author cmdback 僅限於學習交流,有什麼不妥之處,請與我聯繫,謝謝!!! ''' import re #re.findall(patter,string,flags=0) str_1 = 'adbfgchfjdjj123' print(re.findall(r'\d',str_1)) print(re.findall(r'\d{2}',str_1)) print(re.findall(r'\d{3}',str_1)) print(re.findall(r'\d{4}',str_1)) **********************輸出結果************************** E:\anaconda\python.exe D:/coder/python代碼/正則_findall.py ['1', '2', '3'] ['12'] ['123'] []/<code>
好了,今天先說到這吧,為何後面的不寫了,因為後面的說起來有點多,下次再說吧。下期再見!!!