# s='hello world'
# print(s.find('llo'))
# #2 为索引
# ret=s.replace('ll','xx')
# print(ret)
# #hexxo world
# print(s.split('w'))
# #['hello ', 'orld']
#string 提供的为完全匹配
#所以我们需要一个模糊的匹配:正则表达式
#re模块为python中正则表达式的一个调用
import re
#第一个方法 findall
ret=re.findall('lin','fdsggsgfdbcvdlixlinsglkjfds')
print(ret)
#
#二元字符
#元字符 . ^ & * + ? {} [] \ () |
#共十一个元字符
#1. .
ret=re.findall('w..l','hello world')
print(ret)
# . 代指除/的所有东西 它只可代指一个 又称通配符
#2. ^与$
ret=re.findall('^w..l','hello world')
print(ret)
#^代表只从头匹配 只看开始 若开始不同 就结束
ret=re.findall('w..l$','hello worl')
print(ret)
#同理 $代表从结尾匹配
#3.重复* + ? {}
ret=re.findall('zw*','hello zwwwwworld')
print(ret)
#* 代表重复匹配 (0,+∞)
ret=re.findall('ab*','zzza')
print(ret)
#此时*代表0 所以显示a
ret=re.findall('ab+','fdsdfdsabb')
print(ret)
# +与*同理 但+为[1,+_∞]
print(re.findall('a+b','aabfddab'))
#['aab', 'ab']
print(re.findall('a?b','aaaabddfdsabhgfhb'))
#['ab', 'ab', 'b']
#?区间为[0,1]
print(re.findall('a{5}b','vaaaaab'))
#{}为一个定量 可以为任意个数 也可以为一个范围
print(re.findall('a{1,5}b','vaaab'))
#优先选择最多的 比如1-5 优先选最多的 例如上例输出为'aaab'
#我们将其称为贪婪匹配
#结论:*等于{0,+∞} +等于{1,+∞} ?等于{0,1}
#不推荐{}
#4.[]又称字符集
print(re.findall('[c,d]','cd'))
#其中仅有c与d
#结果为['c', 'd'] []的结果代表二选一
print(re.findall('[a-z]',''))
#其中代表a-z的范围
print(re.findall('[w,*]','awdx*'))
#[]字符集会取消 元字符的特殊功能 直接将其视为字符
#但有三个字符例外(\ ^ -)
#-在其中具有范围的意思
# ^放在[]字符集里 代表除 除此以外的除 也就是非
print(re.findall('[^t]','iu12tyAiuS'))
#同时[^4,5] 中,(4,5)是相关联的 之后再进行^处理 也就是说非就是非所有的
#\ 反斜杠
# 反斜杠后边跟元字符去除特殊功能
#反斜杠跟普通字符实现特殊功能
#\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{10}','dsadas231243124327657657567657564'))
#['2312431243', '2765765756']
print(re.findall('\sfdsf','ffdsfsd fdsf fdsf'))
#[' fdsf', ' fdsf']寻找空白的地方
#若为\s 即匹配到了[' ', ' ']
print(re.findall('\w','hello wordl'))
#['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'd', 'l']
#即空格以外全取
print(re.findall('a','I am a man'))
#['a', 'a', 'a']
print(re.findall(r'a\b','I am a man'))
#['a']这样可以仅取想取到的 而不是包含的
print(re.findall('gj\+','gj+z'))
#['gj+'] +为特殊字符 被\取消了
print(re.findall(r'\\','jkd\cd'))
#['\\']
#. ()为分组 | 代表意思为或
print(re.findall('(lin)+','linlinlinazzzi'))
#['lin'] 为什么?
print(re.search('(lin)+','linlinlinzzzi').group() )
#linlinlin
print(re.search('(lin)|2','2lin').group())
#2
print(re.findall('(lin)|2','2lin'))
#['', 'lin']
#三、search方法
ret=re.search('lin','fdsflindhfslin')
print(ret)
#<_sre.SRE_Match object; span=(4, 7), match='lin'>
print(ret.group())
#lin
#search方法仅找一个
#四、难点
ret=re.search('(?P<id>\d{3})(?P<name>\w{3})','weeew34ttt123ooo')
#?P<>为固定格式
#这是一个整体的规则
print(ret.group())
#123/ooo
print(ret.group('id'))
#123
print(ret.group('name'))
#ooo
#正则表达式的方法
# 1.findall():所有 结果都返回到一个列表里
# 2.search():返回匹配到的第一个对象,可调用group() 返回
# 3.match():只在字符串开始匹配,也只返回一个对象,也需要group()
#4.split() 分割
#5sub()替换
#6.compile()为防止重复 可以用编译一次的规则 取进行匹配
#match
ret=re.match('asb','asbfdsfd')
print(ret)
print(ret.group())
#asb
#split()
#字符串中'asdf'.split('s')
print('asdf'.split('s'))
#['a', 'df']
ret=re.split('k','djksal')
print(ret)
#['dj', 'sal']
ret=re.split('[j,s]','djksal')
print(ret)
#['d', 'k', 'al']
#先分第一个,再分第二个,若有多个相同的,则多次分 例如
ret=re.split('[a,b]','adadblbz')
print(ret)
#['', 'd', 'd', 'l', 'z']
#sub 替换
print(re.sub('l.n','z.i','linsdadfzzi'))
#z.isdadfzzi
#好奇怪 我还以为.是不会动的
#compile
obj=re.compile('lin')
ret=obj.findall('linzzzi')
print(ret)