import re
# . ^ $ * + ? { } [ ] | ( ) \ 元字符
# " . " 通配符
re.findall('a..x','assxfsdf') #一个匹配 ['assx']
re.findall('a..x','assxbasdxds') #多个匹配 ['assx', 'asdx']
re.findall('a..x','asaxfxdf') #交差匹配 ['asax']
re.findall('a..x','asaasdasd') #无 []
# " ^ " 以....字符串开头," ^ "不能放在re开头
re.findall('^a..x','assxfsdf') #一个匹配 ['assx']
re.findall('^a..x','assxbasdxds') #多个匹配 ['assx']
re.findall('^a..x','bassxbasdxds') #无 []
re.findall('^a..x','asaasdasd') #无 []
#" $ " 以....字符串结尾
re.findall('a..x$','assxfsdf') # []
re.findall('a..x$','assxbasdadsx') # ['adsx']
re.findall('a..x$','assxbasdadsx$') # []
# " * " 代表0-无穷次其前面的字符个数
re.findall('d*','dasdddasd') # ['d', '', '', 'ddd', '', '', 'd', ''] 为啥最后多了一位
re.findall('alex*','dalesdalexxsdale') # ['ale', 'alexx', 'ale']
# " + " 代表1-无穷次其前面的字符个数
re.findall('d+','dasdddasd') # ['d', 'ddd', 'd'] 贪婪匹配:按最多次的匹配来返回
re.findall('alex+','dalesdalexxsd') # ['alexx']
# " ? " 代表0或1次其前面的字符个数
re.findall('d?','dasdddasd') # ['d', '', '', 'd', 'd', 'd', '', '', 'd', ''] 最后还是多了一位
re.findall('alex?','dalesdalexxsdale') # ['ale', 'alex', 'ale']
# " {} " {0,}==* {1,}==+ {0,1}==? 可认为控制重复的次数
re.findall('d{1}','dasdddasd') # ['d', 'd', 'd', 'd', 'd']
re.findall('d{0}','dasdddasd') # ['', '', '', '', '', '', '', '', '', ''] 还是多了一位
re.findall('d{0,3}','dasdddasd') # ['d', '', '', 'ddd', '', '', 'd', ''] 还是多了一位
re.findall('d{1,3}','dasdddasd') # ['d', 'ddd', 'd']
re.findall('alex?','dalesdalexxsdale') # ['ale', 'alex', 'ale']
# 加一个? " ? " 把贪婪匹配转换为惰性匹配,按最小次匹配
re.findall('d+?','dasdddasd') # ['d', 'd', 'd', 'd', 'd']
re.findall('d*?','daddsd') # ['', 'd', '', '', 'd', '', 'd', '', '', 'd', ''] 没搞懂这个
re.findall('alex*?','dalesdalexxsdale') # ['ale', 'ale', 'ale']
re.findall('alex+?','dalesdalexxsdale') # ['alex']
# " [] " 字符集 或的意思
re.findall("x[yz]","xyzxz") # ['xy', 'xz']
re.findall("x[yz]p","xypzxzpxz") # ['xyp', 'xzp']
re.findall("x[yz]p?","xypzxzpxz") # ['xyp', 'xzp', 'xz']
re.findall("x[y,z]p?","xypzxzpx,z") # ['xyp', 'xzp', 'x,'] , 逗号只是普通字符
re.findall('x[y*z]','xyx*xzjkx') # ['xy', 'x*', 'xz'] 字符集[]中间的都是普通字符
re.findall('x[a-z]','xyx*xzjkx') # ['xy', 'xz'] - 横杠代表的是范围,特殊字符
re.findall('x[a-z*]','xyx*xzjkx') # ['xy', 'x*', 'xz']
re.findall('x[a-z]*','xyx*xzjkx') # ['xyx', 'xzjkx']
re.findall('x[^a-z]*','xZx*x9jkx!xAWExa7,,xz9x99x')
# ['xZ', 'x*', 'x9', 'x!', 'xAWE', 'x', 'x', 'x99', 'x'] " ^ " 尖角代表的是非,非a-z,特殊字符
re.findall('x[^a-z]','xZx*x9jkx!xAWE9x99x') # ['xZ', 'x*', 'x9', 'x!', 'xA', 'x9']
#小练习,如何取出12+(34*6+2-5*(2-1))里面的(2-1)?
re.findall('\([^()]*\)','12+(34*6+2-5*(2-1))') # ['(2-1)'] , \反斜杠,转义字符。也是字符集里面的第3个特殊字符
# " \ " 反斜杠转义字符,可以让有意义变成没意义,没意义变成有意义
# 反斜杠后边跟元字符去除特殊功能,比如\.
# 反斜杠后边跟普通字符实现特殊功能,比如\d
# \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 匹配一个特殊字符边界,比如空格 ,&,#等
re.findall('\d','12+(34*6+2-5*(2-1))') # ['1', '2', '3', '4', '6', '2', '5', '2', '1']
re.findall('\d+','12+(34*6+2-5*(2-1))') # ['12', '34', '6', '2', '5', '2', '1']
re.findall('[0-9]+','12+(34*6+2-5*(2-1))') # ['12', '34', '6', '2', '5', '2', '1']
re.findall('\D','12+(34*6+2-5*(2-1))') # ['+', '(', '*', '+', '-', '*', '(', '-', ')', ')']
re.findall('\D+','12+(34*6+2-5*(2-1))') # ['+(', '*', '+', '-', '*(', '-', '))']
re.findall('[^0-9]+','12+(34*6+2-5*(2-1))') # ['+(', '*', '+', '-', '*(', '-', '))']
re.findall('\s','hello world') # [' ']
re.findall('\S+','hello world') #['hello', 'world']
re.findall('\w+','hello world 333 _') # ['hello', 'world', '333', '_']
re.findall('\W+','hello world 333 _') # [' ', ' ', ' ']
re.findall('www.baidu','www.baidu') # ['www.baidu']
re.findall('www.baidu','www(baidu') # ['www(baidu']
re.findall('www\.baidu','www.baidu') # ['www.baidu']
re.findall('www\.baidu','www(baidu') # []
re.findall('www*baidu','www*baidu') # []
re.findall('www\*baidu','www*baidu') # ['www*baidu']
re.findall('I','hello I am LIST') # ['I', 'I']
re.findall('^I','hello I am LIST') # []
re.findall('I\b','hello I am LIST') # [] 为什么没成功?因为在python中\b就已经被赋予特殊含义了,所以在执行的时候,\b被python优先赋予了特殊意义
re.findall(r'I\b','hello I am LIST') # ['I'] r:raw string 原生字符串,加了r之后,\b就不是python的特殊含义了,而是re语言中的特殊含义
re.findall('I\\b','hello I am LIST') # ['I'] 在python中,"\"也是转义字符,但python会把"\\"翻译成一个没有任何特殊意义的\字符,所以\b也就能被re语言使用了
re.findall('c\\f','abc\ferwt') # ['c\x0c'] 传给re语言的是\f,显然在re语言中,\f并没有特殊的含义,所以能够匹配成功,但是对于\f这个返回值,python对它再进行了一次加工
re.findall('c\l','abc\lerwt') # 为什么我报错,老师的能运行?
re.findall('c\\l','abc\lerwt') # 为什么我报错,老师的能运行?
re.findall('c\\\l','abc\lerwt') # ['c\\l'] 三个\\\也可以,但是这个知识点太细了,暂时跳过
re.findall('c\\\\l','abc\lerwt') # ['c\\l'] 在python层面,4个\\\\就被翻译成无意义的两个\\字符,再传递给re语言就变成一个无意义的\
re.findall(r'c\\l','abc\lerwt') # ['c\\l'] 和上面这个一样的理解
# 至于为什么传回来的是两个\\,因为python解释器对其进行了处理
# 所以,可以简单记忆,当re要使用一个\的时候,你需要通过python给它传过去2个\\
# 当re需要使用2个\\的时候(去匹配\字符的时候),你就要通过python给它传过去4个\\\\
# 问题来了!
re.findall('www.baidu', 'www,baidu') # ['www,baidu'] 这个简单,可以理解,看下面
re.findall('www\.baidu', 'www,baidu') # [] 为什么返回空?python层面,转义字符是不会传给re的,所以re收到的还是www.baidu,按理说,就可以匹配上www,baidu
# 自己的强行解释,当re需要使用类似于\w,\d这种的时候,或者要实际去匹配\这个字符的时候,可以按照两层传递的逻辑去思考
# 当不是这两种情况的时候,就不要考虑两层了!!!!
# " | " 管道符,代表或
re.findall(r'aa|b','abaaab') # ['b', 'aa', 'b']
# " () " 分组符
re.findall('abc','abcabcabcabc') # ['abc', 'abc', 'abc', 'abc']
re.findall('(abc)','abcabcabcabc') # ['abc', 'abc', 'abc', 'abc']
re.findall('(abc)*','abcabcabcabc') # ['abc', '']
re.findall('(abc)+','abcabcabcabc') # ['abc'] 这是因为优先级的问题,在使用()的时候,匹配上之后,python会只返回()里面的内容
re.findall('(?:abc)*','abcabcabcabc') # ['abcabcabcabc', ''] 使用?:组合来去掉re模块()的这种优先级设置
re.findall('(?:abc)+','abcabcabcabc') # ['abcabcabcabc'] 使用?:组合来去掉re模块()的这种优先级设置
re.findall('(abc)?','abcabcabcabc') # ['abc', 'abc', 'abc', 'abc', '']
re.findall('(abc)+','abccc') # ['abc']
re.findall('abc+','abccc') # ['abccc']
re.findall('www\.(baidu|163)\.com','www.baidu.com') # ['baidu'] 分组符()的优先级太高,所以在能够匹配的情况下,只返回这个,这个和上面那个(abc)+的理解是一样的
re.findall('www\.(baidu|163)\.com','www.163.com') # ['163']
re.findall('www\.(baidu|163)\.com','123dsdqwww.163.comwe12r') # ['163']
re.findall('www\.(baidu|163)\.com','weeerww.163.cwweomwe12r') # [] 不能匹配,就返回空
re.findall('www\.(?:baidu|163)\.com','123dsdqwww.163.comwe12r') # ['www.163.com'] ?:可以去优先级
re.findall('a(bc)|(nm)y','nmy') # [('', 'nm')] #分组符与其它符号一起用的时候,会涉及到优先级的问题。。。不太会
re.findall('a(bc)|(nm)y','abcy') # [('bc', '')]
re.findall('a(bc)|(nm)y','abcnmy') # [('bc', ''), ('', 'nm')]
# 第2种方法 search
re.search('\d+','jiang2132zong34') # <re.Match object; span=(5, 9), match='2132'> search只会匹配第一个,而且返回一个对象
re.search('\d{5}','jiang2132zong34') # 如果匹配不成功,则返回None,而不会返回一个空列表
re.search('\d+','jiang2132zong34').group() # '2132',用对象下面的group方法来调用其中的匹配值
re.search('(?P<name>[a-z]+)','jiang25zong33you18').group() # 'jiang' 固定用法,给匹配的值加上name的标签
re.search('(?P<name>[a-z]+)(?P<age>\d+)','jiang25zong33you18').group() # 'jiang25'
re.search('(?P<name>[a-z]+)(?P<age>\d+)','jiang25zong33you18').group('name') # 'jiang'
re.search('(?P<name>[a-z]+)(?P<age>\d+)','jiang25zong33you18').group('age') # '25'
# 第3种方法 match 只会从开头匹配.所以不常用,search完全可以取代match
re.match('\d+','12asd12ad') # <re.Match object; span=(0, 2), match='12'>
re.match('\d+','12asd12ad').group() # '12'
# 第4种方法 split, 分割并返回元祖
re.split(' ','hello world !') # ['hello', 'world', '!']
re.split('[ |]','hello world|!') # ['hello', 'world', '!']
re.split('[ab]','abc') # ['', '', 'c'] 返回的列表中并不会包含用于分割的元素
re.split('a|b','abc') # ['', '', 'c'] 返回的列表中并不会包含用于分割的元素
re.split('(ab)','abc') # ['', 'ab', 'c'] 例外的是,如果使用字符集()用于分割,那么这个元素就会被返回
re.split('[ab]','asdabcd') # ['', 'sd', '', 'cd']
re.split('(ab)','asdabcd') # ['asd', 'ab', 'cd']
re.split('(ab)','asdabcdabcccabccc',maxsplit=2) # ['asd', 'ab', 'cd', 'ab', 'cccabccc']
re.split('(ab)','asdabcdabcccabccc',2) # ['asd', 'ab', 'cd', 'ab', 'cccabccc']
# 第5种方法 sub, 替换并返回字符串
re.sub('\d','_','asd23j23jl32j4kj32k4jlk32j546kl') # 'asd__j__jl__j_kj__k_jlk__j___kl'
re.sub('\d+','_','asd23j23jl32j4kj32k4jlk32j546kl') # 'asd_j_jl_j_kj_k_jlk_j_kl'
re.sub('\d+','_','asd23j23jl32j4kj32k4jlk32j546kl',3) # 'asd_j_jl_j4kj32k4jlk32j546kl'
# 第6种方法 subn, 替换并返回元祖(返回的字符串+匹配的次数)
re.subn('\d','_','asd23j23jl32j4kj32k4jlk32j546kl') # ('asd__j__jl__j_kj__k_jlk__j___kl', 15)
# 第7种方法 finditer,非常重要, 和findall的不同就是,将匹配的数据存到一个迭代器里面,在处理大数据的时候,非常节约内存
re.findall('\d+','12k3e4k5j') # ['12', '3', '4', '5']
re.finditer('\d+','12k3e4k5j') # <callable_iterator object at 0x0000022137C3D160>
re_iter = re.finditer('\d+','12k3e4k5j')
next(re_iter) # <re.Match object; span=(0, 2), match='12'>
next(re_iter).group() # '3'
next(re_iter).group() # '4'
next(re_iter).group() # '5'
next(re_iter).group() # StopIteration
# 特殊的一种方法,编译,compile
com=re.compile('\d+')
com.findall('asd123jkl35') # ['123', '35']
学习笔记为自己根据网络视频整理,侵必删