#正则表达式是用来匹配字符串的
#字符串提供的方法是完全匹配,正则表达式提供的是模糊匹配
import re
print(re.findall('alex','12345alexhelloworldalex9876'))#['alex', 'alex']
ret = re.findall('w\w{2}l','hello world')
print(ret) #['worl']
#正则表达式中的元字符
# . ^ $ * + ? { } [] | () \
# .可以匹配任何字符 只能代指一个字符,除了换行符
ret = re.findall('w..l','hello world')
print(ret) #['worl']
# .不能匹配换行符 .也叫通配符
ret = re.findall('w.l','hello w\nld')
print(ret) #[]
# ^ 只从开始进行匹配
ret = re.findall('^h...o','hello world')
print(ret) #['hello']
# $ 只从结尾进行匹配
ret = re.findall('a..x$','dkjalfsjdalex')
print(ret) #['alex']
# * 重复匹配 *代表0到多次 范围[0,无穷]
ret = re.findall('a.*li','hhjhkjalexlikjdkfj')
print(ret) #['alexli']
# 贪婪模式
ret =re.findall('ba*','jhdjhdshbaaaaaa')
print(ret)#['baaaaaa']
# + 重复匹配 代表1到多次 [1,无穷]
ret = re.findall('a+b','aaaabhghf')
print(ret) #['aaaab']
# ? [0,1] 零次或者1次
ret = re.findall('a?b','aaaaabhgabfb')
print(ret) # ['ab', 'ab', 'b']
# {} 自己在里面定义次数
ret = re.findall('a{5}b','aaaaabcdfhgl')
print(ret) #['aaaaab']
#贪婪匹配 就按照最大匹配个数进行匹配
ret = re.findall('a{1,3}b','aaaab')
print(ret) #['aaab']
#{1,} 等价于 +号 一到正无穷
#默认是贪婪匹配 可以更改为非贪婪匹配
#[] 字符集包括 普通字符 + 元字符
ret = re.findall('a[c,d]x','acx')
print(ret) #[acx]
ret = re.findall('a[c,d]x','adx')
print(ret) #[adx]
ret = re.findall('a[c,d]x','acdx')#匹配不到
print(ret) #[]
ret = re.findall('[a-z]','acx')
print(ret) #['a', 'c', 'x']
#[]字符集:如果是元字符则取消元字符的特殊功能(\ ^ - 这三个例外)
ret = re.findall('[w,*]','awcx*')
print(ret) #['w', '*']
# ^放在[]里面 是取反的意思
ret = re.findall('[^t]','iu12tyAius')
print(ret) #['i', 'u', '1', '2', 'y', 'A', 'i', 'u', 's']
# 非4 或者非5 ^[(4,5)]
ret = re.findall('[^4,5]','iu12ty4Ai5us')
print(ret) #['i', 'u', '1', '2', 't', 'y', 'A', 'i', 'u', 's']
# 下面是\ 的功能
# \ 功能:1、 反斜杠后边跟元字符去除特殊功能
# 2、 反斜杠后边跟普通字符实现特殊功能(跟一部分字符)
# \d 匹配任何十进制数:它相当于类[0-9]
# \D 匹配任何非数字字符 它相当于[^0-9]
# \s 匹配任何空白字符 它相当于[\t\n\r\f\v]
# \S 匹配任何非空白字符 它相当于[^\t\n\r\f\v]
# \w 匹配任何字母数字字符 它相当于[a-zA-Z0-9_]
# \W 匹配任何非字母数字字符 它相当于[^a-zA-Z0-9_]
# \b 匹配一个特殊字符边界,也就是指单词和空格间的位置
# 这是第二个功能
print(re.findall('\d{11}','15098828721')) #['15098828721']
print(re.findall('\w','fak asd')) #['f', 'a', 'k', 'a', 's', 'd']
print(re.findall(r'I\b','hello,I am a LIST')) #['I']
#第一个功能
# search 匹配出第一个满足条件的结果
ret = re.search('sb','sbfjskdsb')
print(ret)
print(ret.group()) #sb
print(re.search('a.','agj').group()) #ag
#
print(re.search('a\.','a.gj').group()) #a.
print(re.search('a\+','a+gj').group()) #a+
# \\
# 过程为先经过python解释器,在经过re模块,这种\要经过两层转义
print(re.findall(r'D\\c','adhfD\c')) #['D\\c']
print(re.findall('D\\\\c','adhfD\c')) #['D\\c']
m = re.search(r'\bblow','blow')
print(m.group()) #blow
# | 是或的意思
# () 用来做分组的
print(re.search('(as)+','sdjkfasas').group()) #asas
# 这种或的形式 是先找到谁就返回谁 立即结束
print(re.search('(as)|3','sd3jkfasas').group()) #3
#分组 ?P<NAME> 这是格式
ret = re.search('(?P<id>\d{3})/(?P<name>\w{3})','weeew34ttt123/ooo')
print(ret)
print(ret.group())
print(ret.group('id'))
print(ret.group('name'))
#正则表达式的方法 六个
# 1 findall() 所有的结果都返回到一个列表里
# 2 search() 返回一个对象(object) 可以调用group查看内容 返回匹配到的第一个对象
# 3 match() 只在字符串开始匹配,返回一个对象(object) 可以调用group查看内容
ret = re.match('asd','helloasd')
print(ret)
ret = re.match('asd','asdhelloasd')
print(ret)
print(ret.group())
# 4 split()
# 先通过j分,后通过s分开
ret = re.split('[j,s]','djksal')
print(ret)
# 5 sub() 替换
ret = re.sub('a..x','sb','hfjasalexdhf')
print(ret)
# 6 compile()
obj = re.compile('\.com') #编译成一个正则表达式对象
print(obj.findall('www.baidu.com'))
print(re.findall('(3)|(as)','sd3jkfasas')) #[('3', ''), ('', 'as'), ('', 'as')]