import re
#元字符1 “.” 通配符,表示什么都能代替,包括数字、字符、字母,除了“/n”不能匹配,一个“.”代表一个符号
ret = re.findall('z..j','fdasfzfdzsaj')
#元字符2:“^”表示匹配以指定字符开头的内容
ret = re.findall('^f..s','fdasfzfdzsaj')
#元字符3:“$”表示匹配以指定字符结尾的内容
ret = re.findall('z.d$','fdasfzfdzsaj')#结果是空
ret = re.findall('z..j$','fdasfzfdzsaj')
#元字符4:“*”表示匹配以紧挨*的字符去匹配重复,重复的次数是0到无穷——贪婪匹配
ret = re.findall('z*','fdasfzzdzsaj')
#元字符5:“+”表示匹配以紧挨+的字符去匹配重复,重复的次数是1到无穷,紧挨+的字符至少得有1个——贪婪匹配
ret = re.findall('z+','fdasfzzdzsaj')
ret = re.findall('zjj*','fdafzj') # ['zj']
ret = re.findall('zjj+','fdafzj') # []
#元字符5:“?”表示匹配以紧挨?的字符去匹配重复,重复的次数是0或者1,最大1次——贪婪匹配
ret = re.findall('zj?','zjjjj') # ['zjj']
ret = re.findall('zjj?','fdasfzzdzj') # ['zj']
#元字符6:“{}”表示匹配以紧挨{}的字符去匹配重复,重复的次数自定义
ret = re.findall('zjj{0,}','fdasfzzdzj') # ['zj'] 相当于 zjj*
ret = re.findall('zjj{1,}','fdasfzzdzj') # [] 相当于 zjj+
ret = re.findall('zjj{0,1}','fdasfzzdzj') # ['zj'] 相当于 zjj?
ret = re.findall('zjj{4}','fdasfzzdzjjjjj') # ['zjjjjj']
ret = re.findall('zjj{1,4}','fdasfzzdzjjjjj') # ['zjjjjj']
ret = re.findall('zjj*?','fdasfzzdzjjjjj') # ['zj']惰性匹配
ret = re.findall('zjj+?','fdasfzzdzjjjjj') # ['zjj']惰性匹配
#元字符[],表示字符集,字符集中以下特殊字符表示特殊意义,“-”,“^”,“\”
ret = re.findall('q[a-z]','qzdasf') #['qz']
ret = re.findall('q[0-9]*','qfds9') #['q']
ret = re.findall('q[0-9]*','q345fds9') #['q345']
ret = re.findall('q[^0-9]*','qf24342ds9') #['qf']
#print(ret)
#计算12+(34*6+2-5*(2-1))
ret = re.findall('\([^()]+\)','12+(34*6+2-5*(2-1))') #['(2-1)']
#\d 表示匹配数字,相当于[0-9]+
ret = re.findall('\d+','12+(34*6+2-5*(2-1))')#['12', '34', '6', '2', '5', '2', '1']
#\D 表示匹配非数字,相当于[^0-9]+
ret = re.findall('\D+','12+(34*6+2-5*(2-1))')#['+(', '*', '+', '-', '*(', '-', '))']
#\s 匹配任何空白字符;它相当于类[ \t\n\r\f\v]。
ret = re.findall('\s+','hello world')#[' ']
#\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
ret = re.findall('\S+','hello world')#['hello', 'world']
#\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
ret = re.findall('\w','hello world#@_')#['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', '_']
#\W 匹配任何字母数字字符;它相当于类 [^a-zA-Z0-9_]。
ret = re.findall('\W','hello world#@_')#[' ', '#', '@']
#\b 匹配一个特殊字符边界,比如空格 ,&,#等
ret = re.findall(r'\bblow', 'blow') #['blow']
ret = re.findall(r'I\b','I am zjj')#字符串前加“r”,表示该字符串是原生字符串,python解释器解释执行的时候,r后面的字符串不做任何转义
ret = re.findall('I\\b','I am zjj')#\b在python中本身是有转义含义
ret = re.findall('c\\\\l','cdasfc\lfdas')
ret = re.findall(r'c\\l',"cdasfc\lfdas")
ret = re.findall('(ab)+','abab')
'''
反斜杠后边跟元字符去除特殊功能,比如\.
反斜杠后边跟普通字符实现特殊功能,比如\d
'''
ret = re.findall('www\.baidu', 'www.baidu') #['www.baidu']
ret = re.findall('www\*baidu', 'www*baidu') #['www*baidu']
ret = re.findall('ka|kb','dsalfkafdkb') #['ka', 'kb']
ret = re.findall('a+','aaaaa')
#元字符之分组
ret = re.findall('(ad)+','add')
ret = re.search('(?P<id>\d{2})/(?P<name>\w{3})','23/com')
#print(ret.group())#23/com
#print(ret.group('id'))
#元字符之方法
ret = re.match('\d+','23rfdsalkj') #相当于search,不过只在字符串开始处进行匹配,返回<_sre.SRE_Match object; span=(0, 2), match='23'>
#print(ret.group())#用group方法取出
#字符分割
ret = re.split(' ','hello world admin') #['hello', 'world', 'admin']
ret = re.split('[ |]','hello world|admin')#['hello', 'world', 'admin']
ret = re.split('[ab]','afdsabdf') #['', 'fds', '', 'df']
#字符替换
ret = re.sub('\d','A','23refdkl242fdgf')#AArefdklAAAfdgf
ret = re.sub('\d','A','23refdkl242fdgf',2)#AArefdkl242fdgf
#返回一个元组,反应替换结果和字符替换次数
ret = re.subn('\d','A','23refdkl242fdgf')#AArefdklAAAfdgf
print(ret)