# re 正则表达式 ****** 学符号 单字符 范围 重复 位置 分组 精准 写不出来百度去
# http://www.cnblogs.com/Eva-J/articles/7228075.html#_label10
'''
re模块
主要正则表达式相关
什么是正则表达式 一堆带有特殊意义的符号组成式子
它的做用 处理(匹配 查找 替换 )字符串
1.
在爬虫中大量使用 其实有框架帮你封装了这些复杂的正则
2.
在网站和手机app的注册功能中大量使用 例如判断你的邮箱地址是否正确
'''
'''
import re
# ===============================单个字符匹配=========print(re.findall("\n","1\n")) # 匹配换行符print(re.findall("\t","1asasas121 \t")) # 匹配制表符# ========================范围匹配===========print(re.findall("\w","1aA_*")) # 匹配数字字母下划线print(re.findall("\W","1aA_*,")) # 匹配非数字字母下划线print(re.findall("\s"," \n\r\t\f")) # 匹配任意空白字符print(re.findall("\S"," \n\r\t\f")) # 匹配任意非空白字符print(re.findall("\d","123abc1*")) # 匹配任意非空白字符print(re.findall("\D","123abc1*")) # 匹配任意非空白字符# print(re.findall("[abc]","AaBbCc")) # 匹配 a b c都行# print(re.findall("[^abc]","AaBbCc")) # 除了 a b c都行# print(re.findall("[0-9]","AaBbCc12349")) # 除了 a b c都行print(re.findall("[a-z]","AaBbCc12349")) # a-z 英文字母print(re.findall("[A-z]","AaBbC:c😀2349[]")) # A-z 匹配原理 是按照ascII码表# =========================匹配位置======print(re.findall("\A\d","123abc1*")) # 从字符串的开始处匹配print(re.findall("\d\Z","123abc1*9\n")) # 从字符串的结束处匹配 注意把\Z写在表达式的右边print(re.findall("\d$","123abc1*9")) # 从字符串的结束处匹配 若是末尾有换行 换行不会参与匹配print(re.findall("^\d","s1asasas121 \t")) # 从字符开始匹配数字# [] 范围匹配 中间 用-来链接# 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| pythonpartten = "(.+?)(\|.+\|)(.+)"".+?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))'''# subprocess *** 子进程 python和另外一个进程交换数据 Popen(命令,输出管道,输入掼蛋,错误管道)'''import subprocess# 就用来执行系统命令import oscmd = r'dir H:\PYTHON-DUJUN\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 能够与这个子进程进行数据交换'''