常用模块(四)
一、subprocess模块
1、subprocess为子流程模块,用于执行系统命令,该模块在Python全栈开发中不常用
2、常用方法
run 返回一个表示执行结果的对象
call 返回的执行的状态码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import subprocess 2 3 res = subprocess.run("tasklist",shell=True,stdout=subprocess.PIPE) 4 print(res.stdout.decode("gbk")) 5 6 print(res.stderr) 7 8 9 res = subprocess.call("tasklist",shell=True) 10 print(res)
3、Popen()方法
1 # 第一个进程a读取tasklist的内容,将数据交给另一个进程b,进程b将数据写到文件中 2 res1 = subprocess.Popen("tasklist",stdout=subprocess.PIPE,shell=True,stderr=subprocess.PIPE) 3 4 res2 = subprocess.Popen("echo >a.txt", stdout=subprocess.PIPE, shell=True, stderr=subprocess.PIPE,stdin=res1.stdout) 5 6 print(res2.stdout.read().decode("gbk"))
二、re模块
1、什么是re
re是正则表达式,正则表达式是一些带有特殊意义的符号或符号的组合
2、常用匹配模式
最常用的有: 单个字符匹配: w 字母数字下划线
s 所有不可见字符( f)
d 所有数字
. 除了 以外的所有字符
^ 字符串的开头,写在表达式的前面
$ 字符串的末尾,写在表达式的后面 范围匹配: [abc] 括号内的一个字符
a|b a或b 重复匹配 {} {,m}:0到m之间, {m,n}:m到n之前 , {m}:必须是m
+ 匹配1个或多个,会一直匹配到不满足条件为止,用“?”问号来阻止贪婪匹配(匹配最少满足条件的字符数)
* 匹配0个或多个,会一直匹配到不满足条件为止,用“?”问号来阻止贪婪匹配(匹配最少满足条件的字符数)
? 匹配1个或0个 分组 () 匹配括号内的表达式,提取括号中的表达式,不会改变原来的表达式逻辑意义
取消分组
(?: )
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import re 2 3 src = 'abc_d12 3d d5s d' 4 5 # d 所有数字 6 print(re.findall('d', src)) 7 # ['1', '2', '3', '5'] 8 9 # w 所有数字字母下划线 10 print(re.findall('w', src)) 11 # ['a', 'b', 'c', '_', 'd', '1', '2', '3', 'd', 'd', '5', 's', 'd'] 12 13 # s 所有不可见字符 14 print(re.findall('s', src)) 15 # [' ', ' ', ' '] 16 17 # . 所有除了 以外的字符 18 print(re.findall('.', src)) 19 # ['a', 'b', 'c', '_', 'd', '1', '2', ' ', '3', 'd', ' ', 'd', '5', 's', 'd']? 20 21 # ^ 匹配行首指定字符 22 print(re.findall('^a', src)) 23 # ['a'] 24 25 # $ 匹配行尾指定的字符 26 print(re.findall('d$', src)) 27 # ['d'] 28 29 # [abd] 匹配中括号内的任意一个字符(a到d,1到3) 30 print(re.findall('[a-d1-3]', src)) 31 # ['a', 'b', 'c', 'd', '1', '2', '3', 'd', 'd', 'd'] 32 print(re.findall('[^a-d]', src)) # 匹配除了a-d以外的字符 33 # ['_', '1', '2', ' ', '3', ' ', '5', 's', ' '] 34 35 # {m,n} 36 print(re.findall('d{1,3}', 'd dd ddd dddd')) 37 # ['d', 'dd', 'ddd', 'ddd', 'd'] 38 39 # + 1个或多个 40 print(re.findall('d+', 'd dd ddd dddd')) 41 # ['d', 'dd', 'ddd', 'dddd'] 42 43 # * 0个或多个 44 print(re.findall('d*', 'd dd ddd dddd')) 45 # ['d', '', 'dd', '', 'ddd', '', 'dddd', ''] 46 47 # ? 0个或1个 48 print(re.findall('d?', 'd 21dd_ 4')) 49 # ['', '', '1', '2', '', '', '', '', '4', '']
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 贪婪匹配 * + 不是固定的特殊符号 只是一种现象 2 # 会一直匹配到不满足条件为止 用问号来阻止贪婪匹配(匹配最少满足条件的字符数) 3 4 print(re.findall("w+?", "ajshsjkdsd")) 5 # ['a', 'j', 's', 'h', 's', 'j', 'k', 'd', 's', 'd'] 6 7 print(re.findall("w*?", "ajshsjkdsd")) 8 # ['', '', '', '', '', '', '', '', '', '', ''] 9 10 print(re.findall("w+?s", "ajshsjkdsd")) 11 # ['ajs', 'hs', 'jkds'] 12 13 print(re.findall("w*?s", "ajshsjkdsd")) 14 # ['ajs', 'hs', 'jkds']
3、re模块的常用方法
(1).findall 从左往右查找所有满足条件的字符 返回一个列表
(2).search 返回第一个匹配的字符串,结果封装为对象
(3).match(不常用) 匹配行首, 返回值与search相同
(4).compile(不常用) 将正则表达式封装为一个正则对象,可以重复使用这个表达式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import re 2 3 print(re.findall('w', src)) 4 # ['a', 'b', 'c', '_', 'd', '1', '2', '3', 'd', 'd', '5', 's', 'd'] 5 6 print(re.search('hello','weqwe hello dddd helllo dd')) 7 # <_sre.SRE_Match object; span=(6, 11), match='hello'> 8 9 print(re.match("hello"," world hello python")) 10 # None
4、分组
分组是从左边第一个左括号起,,index逐步增加,下面的1-4就是res=re.match(r"((a(b)c)(def))","abcdef")
1 ts = "abcdef" 2 reg = r"((a(b)c)(def))" 3 regex = re.compile(reg) 4 res = regex.match(ts) 5 print(res) 6 print(res.span()) # 匹配的结果的区间 7 print(res.group(0)) # abcdef 8 print(res.group(1)) # 1 -> 第一个() abcdef 9 print(res.group(2)) # abc 10 print(res.group(3)) # b 11 print(res.group(4)) # def 12 print(res.groups()) # ('abcdef','abc','b','def')