正則表達(dá)式 應(yīng)用場(chǎng)景 如果你感覺(jué)學(xué)不會(huì),?莫慌,,小編推薦大家加入群, 前面548中間377后面875,,群里有志同道合的小伙伴,, 互幫互助,還可以拿到許多視頻教程,! 特定規(guī)律字符串的查找替換切割等 郵箱格式,、URL、IP等的校驗(yàn) 爬蟲(chóng)項(xiàng)目中,,特定內(nèi)容的提取 使用原則 只要是能夠使用字符串函數(shù)解決的問(wèn)題,,就不要使用正則 正則的效率較低,還會(huì)降低代碼的可讀性 世界上最難理解的三樣?xùn)|西:醫(yī)生的處方,、道士的神符,、碼農(nóng)的正則 提醒:正則是用來(lái)寫(xiě)的,不是用來(lái)讀的,;在不知道功能的情況下,,不要試圖閱讀別人的正則。 基本使用 說(shuō)明:正則的解析處理是由 re 模塊完成 相關(guān)函數(shù): match:從開(kāi)頭進(jìn)行匹配,,匹配到就返回正則結(jié)果對(duì)象,,沒(méi)有就返回None search:從任意位置匹配,匹配到一次就返回,,沒(méi)有就返回None import re # 只從開(kāi)頭匹配,,找到返回一個(gè)正則結(jié)果對(duì)象,沒(méi)有找到返回None # m = re.match('abc', 'abcsdhasdasjabcweuqo') # 全部匹配,,只要找到就停止并返回 m = re.search('abc', 'sdhabcsdasjabcweuqo') if m: # 提取匹配到的內(nèi)容 print(m.group()) # 獲取匹配位置 print(m.span()) findall:全局匹配,,返回匹配到的結(jié)果列表,沒(méi)有時(shí)返回空列表 # 匹配所有內(nèi)容,,返回匹配結(jié)果組成的列表,,若沒(méi)有則返回空列表 f = re.findall('abc', 'qwsdhaslabcsadjlasdoiabcdakls') if f: print(f) print(type(f)) compile:生成正則表達(dá)式對(duì)象 # 生成正則表達(dá)式對(duì)象,用于正則匹配 c = re.compile('hello') # 從開(kāi)頭進(jìn)行匹配 # m = c.match('hellosdsjldkabc') # 從任意位置匹配 m = c.search('shdjkhelloaskjdha') if m: print(m.group()) # 匹配所有 f = c.findall('helloasjdhakhello') if f: print(f) 將正則的匹配分兩步完成:先創(chuàng)建正則對(duì)象,,然后通過(guò)對(duì)象的match,、search、findall方法完成匹配 正則規(guī)則 單個(gè)字符: 普通字符:簡(jiǎn)單來(lái)說(shuō)就是一對(duì)一的完全匹配 []:中間的任意一個(gè)字符 [a-z]:a~z之間的字符(所有小寫(xiě)字母) [0-9]:0~9之間的字符(所有數(shù)字) [A-Z0-9]:所有的大寫(xiě)字母和數(shù)字 [^abc]:除abc外的所有字符 . :匹配' '以外的任意字符 d:所有的數(shù)字,,等價(jià)于[0-9] D:所有的非數(shù)字,,等價(jià)于[^0-9] w:所有的數(shù)字、字母(中文),、下劃線等(就是字) W:所有的非字字符(w的取反) s:所有的空白字符( ,、,、、空格等) S:所有的非空白字符 :詞邊界匹配(開(kāi)頭,、結(jié)尾,、標(biāo)點(diǎn)、空格) B:非詞邊界匹配 次數(shù)控制 *:前面的字符出現(xiàn)任意次 +:前面的字符出現(xiàn)至少一次 ?:前面的字符出現(xiàn)至多一次 :指定次數(shù),,m表示出現(xiàn)的次數(shù) :至少指定次數(shù) :指定范圍內(nèi)的次數(shù),,m到n次之間 {,n}:至多n次,相當(dāng)于 正則的匹配默認(rèn)都是貪婪的(最大限度的匹配) 邊界限定 ^:以指定的內(nèi)容開(kāi)頭 $:以指定的內(nèi)容結(jié)尾 示例 import re # 以指定的內(nèi)容開(kāi)頭 # c = re.compile(r'^abc') # 以指定的內(nèi)容結(jié)尾 c = re.compile(r'kas$') s = c.search('abcsdhkas') if s: print(s.group()) 優(yōu)先級(jí)控制 |:表示或,,它擁有最低的優(yōu)先級(jí) ():用于表示一個(gè)整體,,明確的指定優(yōu)先級(jí) 示例: import re c = re.compile(r'a(hello|world)b') s = c.search('aworldb') if s: print(s.group()) 分組匹配 說(shuō)明:()不但可以作為一個(gè)整體,還可以進(jìn)行分組匹配 示例1: import re c = re.compile(r'(d+)([a-z]+)(d+)') s = c.search('shd327sjahdajhsd87892ehawksd') if s: print(s.group()) # 默認(rèn)就是全部的匹配內(nèi)容,,等價(jià)于上式 print(s.group(0)) # 第一個(gè)()匹配到的內(nèi)容 print(s.group(1)) print(s.group(2)) print(s.group(3)) print(s.span()) print(s.span(0)) print(s.span(1)) print(s.span(2)) print(s.span(3)) 示例2:給分組起名字 import re # 固定匹配 # c = re.compile(r' w+ ') # 表示前面第一個(gè)小括號(hào)匹配的內(nèi)容 # c = re.compile(r'w+') # 給()起名字 c = re.compile(r'[a-z]+)>[a-z]+)>w+') s = c.search(' 百度一下 ') if s: print(s.group()) 貪婪匹配 貪婪:最大限度的匹配叫貪婪,。正則的匹配默認(rèn)是貪婪。 非貪婪:只要滿足匹配條件,,能少匹配就少匹配,;通過(guò)可以使用'?'進(jìn)行取消貪婪 示例: import re # 取消任意多次的貪婪 # c = re.compile(r'a.*?b') # 取消至少一次的貪婪 c = re.compile(r'a.+?b') s = c.search('abdhsadjbsdjabs') if s: print(s.group()) 匹配模式 說(shuō)明:所謂模式就是對(duì)匹配的原則進(jìn)行整體的修飾 示例: import re # 忽略大小寫(xiě)的匹配 # c = re.compile(r'hello', re.I) # s = c.search('Hello world') # 進(jìn)行多行匹配,默認(rèn)單行匹配 # c = re.compile(r'^hello', re.M) # s = c.search('world hello') # 做為單行處理 或 讓 . 能夠匹配 c = re.compile(r' .*? ', re.S) # string = ' hello ' string = ''' hello s = c.search(string) if s: print(s.group()) 字符轉(zhuǎn)義 若匹配正則語(yǔ)法中的特定字符都需要進(jìn)行轉(zhuǎn)義 正則字符串會(huì)被處理兩次,,python中處理一次,,re模塊會(huì)在處理一次 若不想考慮字符的轉(zhuǎn)義問(wèn)題,可以在書(shū)寫(xiě)正則字符串時(shí)前面加一個(gè)字符'r' 添加'r'之后,,在python不會(huì)再進(jìn)行任何轉(zhuǎn)義,,只需在與正則語(yǔ)法相關(guān)的字符前加''即可讓其使用原有意義 網(wǎng)絡(luò)編程 相關(guān)概念 OSI七層模型:開(kāi)放系統(tǒng)互連參考模型。它從低到高分別是:物理層,、數(shù)據(jù)鏈路層,、網(wǎng)絡(luò)層、傳輸層,、會(huì)話層,、表示層和應(yīng)用層,。 TCP/IP:在OSI七層模型的基礎(chǔ)上簡(jiǎn)化抽象出來(lái)的一套網(wǎng)絡(luò)協(xié)議簇,,現(xiàn)在得到了廣泛使用。 TCP:傳輸控制協(xié)議 有連接的,,數(shù)據(jù)是安全有保障的 傳輸?shù)乃俣壬月?,三次握手、四次揮手,、數(shù)據(jù)檢查 UDP:用戶數(shù)據(jù)報(bào)協(xié)議 無(wú)連接的,,數(shù)據(jù)是不可靠的 傳輸?shù)乃俣缺容^快 IP地址:唯一的一臺(tái)計(jì)算標(biāo)識(shí) 查看:ipconfig ping:檢查網(wǎng)絡(luò)連通性 使用:ping IP/域名 端口號(hào):每個(gè)應(yīng)用可以擁有唯一的端口號(hào) 范圍:0~65535 系統(tǒng):0~1024,常用的應(yīng)用所占用 http:80 https:443 smtp:25 ftp:21 ssh:22 mysql:3306 redis:6379 自己:大于1024 網(wǎng)絡(luò)編程核心: IP + 端口 庫(kù):socket TCP協(xié)議 說(shuō)明:面向連接,、數(shù)據(jù)可靠(校驗(yàn)重發(fā)),、三次握手,、四次揮手、傳輸速度較慢 原理:見(jiàn) tcp.png 示例:見(jiàn) 01-tcp-http.py TCP協(xié)議的服務(wù)器與客戶端:見(jiàn) 02-tcp-server.py 與 03-tcp-client.py UDP協(xié)議 說(shuō)明:面向無(wú)連接的,、數(shù)據(jù)不可靠,、傳輸速度較快,適應(yīng)于對(duì)數(shù)據(jù)要求不嚴(yán)格的情況 原理:見(jiàn) udp.png 示例:模擬飛秋發(fā)送數(shù)據(jù),,見(jiàn) 04-udp-feiqiu.py UDP協(xié)議的服務(wù)器與客戶端:見(jiàn) 05-udp-server.y 與 06-udp-client.py StringIO與BytesIO 說(shuō)明:這些類(lèi)型的對(duì)象可以與open返回的對(duì)象一樣操作,,但是操作的內(nèi)存中的數(shù)據(jù) 方法:getvalue用于獲取所有數(shù)據(jù) |
|
來(lái)自: 首家i55ryzehof > 《電腦知識(shí)》