走入計算機的第二十六天(內置模塊4)
一 補充正則表達式的其他一些使用方法
1.貪婪模式:在滿足匹配時,匹配盡可能長的字符串,默認情況下,采用貪婪匹配
1 #貪孌匹配 2 # ret=re.findall("abc+","abccccccccccccccgds") 3 # print(ret) 4 5 # ret=re.findall("abc{1,}","abccccccccccccccgds") 6 # print(ret)
2非貪婪匹配:在滿足匹配時,匹配盡可能短的字符串,使用?來表示非貪婪匹配
1 #非貪孌模式 2 # ret=re.findall("abc+?","abccccccccccccccgds") 3# print(ret) 4 5 # s="asfdhgfasflfhfas" 6 # ret=re.findall("as.*?as",s) 7 # print(ret)
幾個常用的非貪婪匹配Pattern
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
3 .*?的用法:
1 . 是任意字符 2 * 是取 0 至 無限長度 3 ? 是非貪婪模式。 4 何在一起就是 取盡量少的任意字符,一般不會這麽單獨寫,他大多用在: 5 .*?x 6 7就是取前面任意長度的字符,直到一個x出現
4 re.findall
1 #import re 2 #re.findall() 3 # ret=re.findall("abc(?:\d)","abc34das") #1返回的是列表的格式 2 findall優先篩選 4 # print(ret)
註意: findall的優先級查詢:
# import re # # ret=re.findall(‘www.(baidu|oldboy).com‘,‘www.oldboy.com‘) # print(ret)#[‘oldboy‘] 這是因為findall會優先把匹配結果組裏內容返回,如果想要匹配結果,取消權限即可# # ret=re.findall(‘www.(?:baidu|oldboy).com‘,‘www.oldboy.com‘) # print(ret)#[‘www.oldboy.com‘]
5 re.split
1 #分割 2 # s="hello23fang54jie543jia" 3 # ret=re.split("\d+",s) 4 # print(ret) 5 # 6 # #自定義分割 7 # s="hello23fang54jie543jia" 8 # ret=re.split("\d+",s,1) 9 # print(ret) 10 11 #同時返回分隔符 12 # s="hello23fang54jie543jia" 13 # ret=re.split("(\d+)",s) 14 # print(ret)
註意 split的優先級查詢
1 ret=re.split("\d+","yuan2egon56alex") 2 print(ret) 3 4 ret=re.split("(\d+)","yuan2egon56alex") 5 print(ret)
6 replace
#替換 # ret="hello fang".replace("fang","jie") # print(ret)
7 re.sub
1 #多個同時替換 2 # ret=re.sub("f.*?g","jieshao","hello fang fhog felscg") 3 # print(ret)
8 re.subn
#多個替換,同時顯示替換詞數 # ret=re.subn("f.*?g","jieshao","hello fang fhog felscg") # print(ret)
9 re.compile
#編譯 # obj=re.compile("\d+") # a=obj.findall("sfjdskghr7o456o474o56j5h") #print(a) # ret=obj.findall("sdg36ew4375g5445y") #和re.findall一樣,不過可以在多個使用時,同時使用一個編譯 # print(ret)
10 re.finditer
#叠代器 # ret=re.finditer("\d+","sdj6jtqbvw4y4n56m456h876nl;wnB%$5ln56l7jb6kn7jiuk3vtb5jnil6756") # print(ret) # print(next(ret).group()) # print(next(ret).group()) # print(next(ret).group()) # print(next(ret).group()) # print(next(ret).group())
二 configparser模塊
該模塊適用於配置文件的格式與windows ini文件類似,可以包含一個或多個節(section),每個節可以有多個參數(鍵=值)。
1 創建文件 如下
1 #文件的基本格式是 例如: 2 # [DEFAULT] 3 # ServerAliveInterval = 45 4 # Compression = yes 5 # CompressionLevel = 9 6 # ForwardX11 = yes 7 # 8 # [bitbucket.org] 9 # User = hg 10 # 11 # [topsecret.server.com] 12 # Port = 50022 13 # ForwardX11 = no 14 15 #configparser使用的格式是:分為三段,每段相當於是一個字典的形式,然後字典裏面在包含一個字典 16 #生成文件的方法是 17 #fang=configparser.ConfigParser() #首先調用模塊的對象,然後再賦值給一個對象 18 #fang["DEFAULT"]={"key1":"vales1","key2‘:"vales2"........} 19 #fang[ "自定義字典名稱"]={"key1":"vales1","key2":‘vales2".....} 20 #fang["自定義字典名稱2”]={"key1":"vales1","key2":vales2"......} 21 #with open("要添加的路勁","w")as f: 22 # fang.write(f) 23 24 # import configparser 25 # #例如將下面內容寫入到文件中 26 # fang=configparser.ConfigParser() 27 # fang["DEFAULT"]={ 28 # "ServerAliveInterval" :45, 29 # "Compression" :"yes", 30 # "CompressionLevel" : 9, 31 # "ForwardX11" : "yes" 32 # } 33 # fang["bitbucket.org"]={"User": "hg"} 34 # fang["topsecret.server.com"]={"Port" : 50022,"ForwardX11" :"no"} 35 # with open("yuan.txt","w")as f: 36 # fang.write(f) 37 #
創建的第一個字段名稱必須是DEFAULT名稱,後面創建的字段可以自定義名稱,第一個字段創建的內容會在後面創建的每一個字段中自動添加上去。
2 操作文件
1 # #操作文件:讀與寫操作 2 # import configparser 3 # jie=configparser.ConfigParser() 4 # jie.read("yuan.txt") 5 # print(fang.sections()) #查字段的信息 6 # 7 # import configparser 8 # jie=configparser.ConfigParser() 9 # jie.read("yuan.txt") 10 # print(‘topsecret.server.com‘ in fang) #查看字段是否在該字典裏 11 # 12 # 13 # import configparser 14 # jie=configparser.ConfigParser() 15 # jie.read("yuan.txt") 16 # print(fang.items("topsecret.server.com")) #取出某個字段的內容 17
3 查找文件
1 # import configparser 2 # 3 # config = configparser.ConfigParser() 4 # 5 # #---------------------------查找文件內容,基於字典的形式 6 # 7 # print(config.sections()) # [] 8 # 9 # config.read(‘example.ini‘) 10 # 11 # print(config.sections()) # [‘bitbucket.org‘, ‘topsecret.server.com‘] 12 # 13 # print(‘bytebong.com‘ in config) # False 14 # print(‘bitbucket.org‘ in config) # True 15 # 16 # 17 # print(config[‘bitbucket.org‘]["user"]) # hg 18 # 19 # print(config[‘DEFAULT‘][‘Compression‘]) #yes 20 # 21 # print(config[‘topsecret.server.com‘][‘ForwardX11‘]) #no 22 # 23 # 24 # print(config[‘bitbucket.org‘]) #<Section: bitbucket.org> 25 # 26 # for key in config[‘bitbucket.org‘]: # 註意,有default會默認default的鍵 27 # print(key) 28 # 29 # print(config.options(‘bitbucket.org‘)) # 同for循環,找到‘bitbucket.org‘下所有鍵 30 # 31 # print(config.items(‘bitbucket.org‘)) #找到‘bitbucket.org‘下所有鍵值對 32 # 33 # print(config.get(‘bitbucket.org‘,‘compression‘)) # yes get方法取深層嵌套的值 34 #
三 subprocess模塊
當我們需要調用系統的命令的時候,最先考慮的os模塊。用os.system()和os.popen()來進行操作。但是這兩個命令過於簡單,不能完成一些復雜的操作,如給運行的命令提供輸入或者讀取命令的輸出,判斷該命令的運行狀態,管理多個命令的並行等等。這時subprocess中的Popen命令就能有效的完成我們需要的操作。
subprocess模塊允許一個進程創建一個新的子進程,通過管道連接到子進程的stdin/stdout/stderr,獲取子進程的返回值等操作。The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes.(子進程模塊允許您生成新進程,連接到輸入/輸出/錯誤管道,並獲取其返回代碼。)
This module intends to replace several other, older modules and functions, such as: os.system、os.spawn*、os.popen*、popen2.*、commands.*(此模塊旨在替換其他較舊的模塊和函數,例如:os.system,os.spawn *,os.popen *,popen2。*,commands *)
這個模塊只一個類:Popen。
1 簡單命令
# import subprocess # # # 創建一個新的進程,與主進程不同步 if in win: s=subprocess.Popen(‘dir‘,shell=True) # s=subprocess.Popen(‘ls‘) # s.wait() # s是Popen的一個實例對象
2 命令帶參數
1 # import subprocess 2 # s=subprocess.Popen("Ls-L",shell=True) #命令帶參數
3 控制子進程
當我們想要更個性化我們的需求的時候,就要轉向Popen類,該類生成的對象用來代表子進程。剛才我們使用到了一個wait方法
此外,你還可以在父進程中對子進程進行其它操作:
# s.poll() # 檢查子進程狀態 # s.kill() # 終止子進程 # s.send_signal() # 向子進程發送信號 # s.terminate() # 終止子進程 # # s.pid:子進程號 ‘‘‘
4 子進程的文本流控制
可以在Popen()建立子進程的時候改變標準輸入、標準輸出和標準錯誤,並可以利用subprocess.PIPE將多個子進程的輸入和輸出連接在一起,構成管道(pipe):
1 # import subprocess 2 # s=subprocess.Popen("Ls-L",shell=True,stdout=subprocess.PIPE) 3 # print(s.stdout.read()) #拿到一個字節 4 # 5 # import subprocess 6 # s=subprocess.Popen("Ls-L",shell=True,stdout=subprocess.PIPE) 7 # print(s.stdout.read().decode("gbk")) #進行一個轉換
ubprocess.PIPE實際上為文本流提供一個緩存區。s1的stdout將文本輸出到緩存區,隨後s2的stdin從該PIPE中將文本讀取走。s2的輸出文本也被存放在PIPE中,直到communicate()方法從PIPE中讀取出PIPE中的文本。
註意:communicate()是Popen對象的一個方法,該方法會阻塞父進程,直到子進程完成
5 快捷API
‘‘‘ subprocess.call() 父進程等待子進程完成 返回退出信息(returncode,相當於Linux exit code) subprocess.check_call() 父進程等待子進程完成 返回0,檢查退出信息,如果returncode不為0,則舉出錯誤subprocess.CalledProcessError,該對象包含 有returncode屬性,可用try…except…來檢查 subprocess.check_output() 父進程等待子進程完成 返回子進程向標準輸出的輸出結果 檢查退出信息,如果returncode不為0,則舉出錯誤subprocess.CalledProcessError,該對象包含 有returncode屬性和output屬性,output屬性為標準輸出的輸出結果,可用try…except…來檢查。
走入計算機的第二十六天(內置模塊4)