走入计算机的第二十六天(内置模块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命令就能有效的完成我们需要的操作。

      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)的主要内容,如果未能解决你的问题,请参考以下文章

走入计算机的第二十七天(模块与包的调用)

走入计算机的第十六天(字典和合集)

javaSE第二十六天

走入计算机的第三十六天(自己创建锁及锁的类型)

回到javaweb的第二十六天(删除选中的高级功能,全选)

回到javaweb的第二十六天(案例的高级功能)(删除选中)