今日内容:
一、re模块
二、re练习
三、subproces模块
一、re模块
import re # [] 范围匹配 中间 用-来连接 # re.findall("[a-zA-Z0-9]","a ab abc abcd a123c") # 如果要匹配 符号- 要写表达式的左边或右边 # print(re.findall("[-ab]","a ab abc abcd a123c a--")) # 重复匹配 表达式的匹配次数 # * 表示 任意次数 所以0次也满足 print(re.findall("[a-zA-Z]*","a ab abc abcdssdsjad a123c")) # [a-zA-Z]* # + 一次或多次 print(re.findall("[a-zA-Z]+","a ab abc abcdssdsjad a123c")) # [a-zA-Z]+ # ? 0次或1次 print(re.findall("[a-zA-Z]?","a ab abc abcdssdsjad a123c")) # {1,2} 自定义匹配次数 {1,} 1到无穷 {,1} 0到1次 print(re.findall("[a-zA-Z]{1,2}","a ab abc abcdsdssjad a123c")) # + * 贪婪匹配 表达式匹配的情况下 尽可能的多拿 (一直匹配 直到不满足为止) # print(re.findall("\w*","jjsahdjshdjssadsa dssddsads")) # print(re.findall("\w+","jjsahdjshdjssadsa dssddsads")) # 非贪婪匹配 在表达式的后面加上? # print(re.findall("\w?","jjsahdjshdjssadsa dssddsads")) # 非贪婪匹配 # text = """<img src="https://ss1.baidu.com/6ONXsjip0@#4$QIZ8tyhnq/it/u=2972240716,3143951157&fm=55&app=22&f=JPEG?w=121&h=81&s=0FB86D855C624C9C0AB1F57203008031" class="c-img c-img6">""" # 演示贪婪匹配 print(re.findall('src="(http.*?)"',text)) # 非贪婪匹配 在表达式的后面加上? print(re.findall('src="http.*"',text)) # print(re.findall("[a-zA-Z]*","a|ab|abc|abcd|a123c")) # 分组 加上分组 不会改变原来的规则 仅仅是将括号中的内容单独拿出来了 print(re.findall("([a-zA-Z]+)_dsb","aigen_dsb cxx_dsb alex_dsb zxx_xsb _dsb")) # re模块中常用的函数 # match 从字符串开始处匹配 只找一个 print(re.match("\w*","abc").group(0)) # 获取匹配成功的内容 # group 用来获取某个分组的内容 默认获取第0组 就是整个表达式本身 print(re.match("([a-zA-Z]+)(_dsb)","aigen_dsb cxx_dsb alex_dsb zxx_xsb _dsb").group(2)) print(re.match("\w*","abc").span()) # 获取匹配成功的内容的索引 print(re.search("\w*","abc").group()) # 从全文范围取一个 print(re.search("([a-zA-Z]+)(_dsb)","xxx aigen_dsb cxx_dsb alex_dsb zxx_xsb _dsb")) # 从开始的位置开始匹配 # print(re.match("([a-zA-Z]+)(_dsb)","xxx aigen_dsb cxx_dsb alex_dsb zxx_xsb _dsb").group()) # 将正则表达式 编译成一个对象 往后可以不用在写表达式 直接开始匹配 # print(re.compile("\w*").findall("abcd")) # print(re.split("\|_*\|","python|____|js|____|java")) # 替换 print(re.sub("python","PYTHON","js|python|java")) # 用正则表达式来交换位置 text = "java|C++|js|C|python" # text1 = "java|C++|js|C|python" # 将整个内容分为三块 java |C++xxxxxx| python partten = "(.+?)(\|.+\|)(.+)" ".+?ahgshags" # ?:用于取消分组 就和没写括号一样 # partten = "(?:.+?)(\|.+\|)(.+)" # print(re.search(partten,text).group(0)) print(re.sub(partten,r"\2\3\1",text)) # 当要匹配的内容包含\时 text = "a\p" "\p" print(text) print(re.findall(r"a\\p",text))
二、re练习案例
# qq密码 长度6--16 数字字母特殊 不包含^ # 如果包含^ 不匹配任何内容 # 除了^ 别的都能匹配上 "[^\^]{6,16}" import re # print(re.search("[^^]{6,16}","1234567^as^")) # print(re.search("[^[\^]+.{6,16}","1234567as")) # print(re.match("[^@]{6,16}","1234567@")) # # print(re.match("[a-z]{6,16}","abasadsasasa^")) # 长度必须为6 不能包含@ print(re.match("^[^^]{6,8}$","1111111^56781111")) # print(re.match("[0-9]{6,7}","1234567")) # print(re.match("^\"[^@]{6,16}\"$", '"1234567io1u"')) # ^$ 整体匹配 将字符串内容看作一个整体 而不是像之前的逐个匹配 print(re.match("^[^^]{3,6}$","1234567")) # # 手机号码验证 长度11 以1开头 全都是数字 print(re.match("^1(89|80|32)\d{8}$","18921999093")) # 邮箱地址验证 字母数字下划线(至少6个)@字母数字下划线(最少一个).(cn com org edu任意一个) 可以有18921999093@189.cn partten = "^\w{6,}@\w+\.(cn|com|org|edu)$" # 只接受 qq sina 163 print(re.match(partten,"18921999as dsadsadsadsasdad093@189.cn")) # 身份证号码 要么18 要么15位数字 最后一个可能是X # partten = "^\d{17}(X|\d)$" partten2 = "(^\d{15}$)|(^\d{17}(X|\d)$)" print(re.match(partten2,"123321200010100"))
三、subproces模块
import subprocess # 就用来执行系统命令 import os cmd = r'dir D:\上海python全栈4期\day23 | findstr "py"' # res = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) # # 从管道中读取数据 管道就是 两个进程通讯的媒介 # # print(type(res.stdout.read().decode("GBK"))) # print(res.stdout.read().decode("GBK")) # print(res.stderr.read().decode("GBK")) dir = r'dir D:\上海python全栈4期\day23' find = 'findstr "py"' """ stdout 输出管道 stdin 输入管道 stderr 错误管道 """ res1 = subprocess.Popen(dir,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE) res2 = subprocess.Popen(find,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,stdin=res1.stdout) # 从管道中读取数据 管道就是 两个进程通讯的媒介 # print(type(res.stdout.read().decode("GBK"))) # print(res1.stdout.read().decode("GBK")) print(res2.stderr.read().decode("GBK"),"33333") # 简单总结 subprocess 主要用于执行系统指令 (启动子进程) 与os.system的不同在于 # subprocess 可以与这个子进程进行数据交换