#re模块(正则表达式):用作模糊匹配
# 分为两种:①元字符:".","^","$","*","+","?","{}","[]","|","()",""
# ②普通字符
import re
#通配符"."(除n以外所有字符都可匹配)
print(re.findall('a.c','abcabcabcadcadcabbbc')) #['abc', 'abc', 'abc', 'adc', 'adc']
#"^"(开头匹配)
print(re.findall('^a..','abcddaccd')) #['abc']
#"$"(结尾匹配)
print(re.findall('a..d$','abcdabcdaacad')) #['acad']
#"*"(匹配[0,+oo)次)
# print(re.findall('*abcd','abcd')) #放在开头会报错
print(re.findall('abcd*','abcdddabcaabcdbabc')) #['abcddd', 'abc', 'abcd', 'abc']
#"+"(匹配(1,+oo)次)
# print(re.findall('+abcd','abcdabcaabcdbabc')) #同上
print(re.findall('abcd+','abcdddabcaabcdbabc')) #['abcddd', 'abcd']
#"?"(匹配0次或1次)
# print(re.findall('?abcd','abcdddabcaabcdbabc')) #报错
print(re.findall('abcd?','abcdddabcaabcdbabc')) #['abcd', 'abc', 'abcd', 'abc']
#"{}"
print(re.findall('abc{3}','abcabcccabcccd')) #c需要重复三次,['abccc', 'abccc']
print(re.findall('abc{1,6}','abcabccabcccabccccd')) #c重复1,2,3,4,5,6次都可以,['abc', 'abcc', 'abccc', 'abcccc']
print(re.findall('abc{0,}','abcababcccd')) #相当于"*",['abc', 'ab', 'abccc']
print(re.findall('abc{1,}','ababcabccabccd')) #相当于"+",['abc', 'abcc', 'abcc']
print(re.findall('abc{0,1}','aabcabbccabccd')) #相当于"?",['ab', 'abc', 'abc', 'abc']
#"*","+","?","{}"都是贪婪匹配,在后边加上"?"变成惰性匹配
print(re.findall('abc*?','ababcabccabccd')) #['ab', 'ab', 'ab', 'ab']
print(re.findall('abc+?','ababcabccabccd')) #['abc', 'abc', 'abc']
print(re.findall('abc??','ababcabccabccd')) #['ab', 'ab', 'ab', 'ab']
print(re.findall('abc{1,3}?','ababcabccabccd')) #['abc', 'abc', 'abc']
#字符集"[]"(表示或者),"^"在这里表示非,"-"表示范围
print(re.findall('[abc]','abc')) #['a', 'b', 'c']
print(re.findall('a[a-z]','ababcabcab')) #['ab', 'ab', 'ab', 'ab']
print(re.findall('a[a-z]*','abcadded123')) #['abcadded']
print(re.findall('a[^a-z]*','a123abc')) #['a123', 'a']
#转义符""(将有特殊功能的变为普通字符,将普通字符变成有功能的字符
# d匹配任何十进制数字
# D匹配任何非数字字符
# s匹配任何空白字符
# S匹配任何非空白字符
# w匹配任何字母数字字符
# W匹配任何非字母数字字符
# b匹配一个特殊字符边界,比如空格、&,#等
print(re.findall('d','abc123')) #['1', '2', '3']
print(re.findall('\d','abc123')) #[]
print(re.findall('D','abc123##')) #['a', 'b', 'c', '#', '#']
print(re.findall('D*','abc123##')) #['abc', '', '', '', '##', '']
#管道符"|",表示或
print(re.findall('xa|b','xaddxbxab')) #['xa', 'b', 'xa', 'b']
print(re.findall('x[ab]','xaddxbxab')) #['xa', 'xb', 'xa']
#分组"()"
print(re.findall('(ad)','adadabcd')) #['ad', 'ad']
print(re.findall('(jq)|(dwj)','abcjqdwjabc')) #[('jq', ''), ('', 'dwj')]
#re模块中的常用方法
#返回满足条件的所有结果,放在列表中返回
print(re.findall('abc','abcabcabc')) #['abc', 'abc', 'abc']
#匹配到第一个就返回,返回字符串,搭配group()方法
print(re.search('abc','abcabcabc')) #
print(re.search('abc','abcabcabc').group()) #abc
#从字符串开头开始匹配,遇到第一个就返回
print(re.match('abc','abcabcabc')) #
print(re.match('abc','abcabcabc').group()) #abc
#分割
print(re.split('a','abcadef')) #['', 'bc', 'def']
#先按照a分割,再按照d分割
print(re.split('a','abdcdasdfh')) #['', 'bdcd', 'sdfh']
print(re.split('[ad]','abdcdasdfh')) #['', 'b', 'c', '', 's', 'fh']
#三个参数,将前者替换为后者
print(re.sub('d+','A','abc123dd45')) #abcAddA
print(re.sub('d','A','abc123dd45')) #abcAAAddAA
#四个参数,第四个参数表示前三个替换
print(re.sub('d','A','abc123dd45',3)) #abcAAAdd45
#返回结果替换了几次
print(re.subn('d','A','abc123dd45')) #('abcAAAddAA', 5)
#定制匹配规则,方便使用
print(re.compile('d+').findall('abc123def456')) #['123', '456']
#按照规则取出元素放到一个迭代器中
ret = re.finditer('d','abc123456')
print(ret) #
print(next(ret).group()) #1
print(next(ret).group()) #2
#()具有优先级,里边的内容优先匹配出来
print(re.findall('www.(baidu|163).com','www.baidu.com')) #['baidu']
#?:--->去除优先级
print(re.findall('www.(?:baidu|163).com','www.baidu.com')) #['www.baidu.com']