走入计算机的第二十六天(内置模块4)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了走入计算机的第二十六天(内置模块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命令就能有效的完成我们需要的操作。
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)的主要内容,如果未能解决你的问题,请参考以下文章