import re
#正则表达式是用来干什么的?匹配字符串
#首先回顾一下字符串的使用方法。
# s = "hello world"
# print(s.find("e")) #查找
# ret = s.replace("ll","xx")
# print(ret)
# print(s.split("w"))
#string提供的方法是完全匹配。
#切入正题,正则匹配【模糊匹配】
# print(re.findall("w\w{2}l","hello world")) #['worl']
# . 匹配除换行符以外的任意字符
# \w 匹配字母或数字或下划线或汉字 等价于 '[^A-Za-z0-9_]'。
# \s 匹配任意的空白符
# \d 匹配数字
# \b 匹配单词的开始或结束
# ^  匹配字符串的开始
# $  匹配字符串的结束
# \w 能不能匹配汉字要视你的操作系统和你的应用环境而定
# print(re.findall("alex","sldfkjlajalexlskjdfalex"))#['alex', 'alex']杀鸡焉用牛刀s.find能搞定!!
"""
r"\b"     r的意思是声明原生字符串,不需要二次转意 例如“\b \\\b”
元字符
.通配符   代表除了换行符之外的所有单个字符
^尖角符   只以字符串开始来匹配
$导乐符   只以结尾匹配。
*星字符   重复匹配,重复前面一个字符来匹配0到+oo个。 * == {0,+oo}正无穷 推荐使用
+加字符   重复匹配,重复前面一个字符来匹配1到+oo个。 + == {1,+oo}        推荐使用  
?问号符   匹配,重复前面一个字符来匹配0到1个        ? == {0,1}          推荐使用
{}大括号  重复匹配,重复前面一个字符来匹配{}个 {5}5次{1,3}1到3次,贪婪匹配,多个满足取最多。
[]字符集  或的关系[c,d]c或者d,只能匹配1次,[a-z]表示a,b,c,d...z 
[]字符集  取消元字符的特殊功能 "a[w,*]d","aedaxdapda*dawd" ,,也行,我去
[]字符集  三个例外 \ ^ - 三个例外的不取消元字符的特殊功能
[^]取反   [^4,5]","123456"))#['1', '2', '3', '6']取反,怎么匹配45???
|管道符   或的意思
\反斜杠符 最重要的一个 反斜杠符后面跟元字符去除特殊功能
\反斜杠符 最重要的一个 反斜杠符后面跟普通字符实现特殊功能
    \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  匹配一个[单词|特殊]字符的边界,比如空格 ,&,#,,¥,%等 r"I\b","I am a LI$T"
"""
# print(re.findall("w..l","hello world"))#['worl'] .代表除了换行符之外的所有单个字符
# print(re.findall("^h...o","lsdhflhello")) #^只以开始匹配。[]
# print(re.findall("h...o$","lsdhflhello")) #^只以结尾匹配。['hello']
# print(re.findall("alex.*li","lsdhaalexflhellilo")) #*重复匹配,重复前面一个字符来匹配。['alexflhelli']
# print(re.findall("alex*li","lsdhaalexxxxxxxlilo")) #*重复匹配,重复前面一个字符来匹配。['alexxxxxxxli']# print(re.findall("ab+","skldfaaaa"))#[] b+ 也代表b0,就是0个b,(+至少1个B) 匹配不上 1-+oo
# print(re.findall("a?b","skldbfaaaba"))#['b', 'ab']a?b 能匹配0个a或者1个a
# print(re.findall("a{5}b","sdfadsfaaaaaabsdflkas"))#['aaaaab']重复匹配,重复前面一个字符来匹配{5}个。
# print(re.findall("a{3,5}b","sdfadsfaaaaaabsdflkas"))#['aaaaab']重复匹配,重复前面一个字符来匹配{3到5}个,多个满足取最多。
# print(re.findall("a[e,x]d","aedaxdapd"))#['aed', 'axd']或的关系[e,x]c或者d,只能匹配1次可是是空格。
# print(re.findall("a[w,*,.,,]d","aedaxa.ddapda*daa,dwd"))#['a.d', 'a*d', 'a,d']取消元字符的特殊功能*w 。
# print(re.findall("a[a-z]d","aedaxa.ddapda*daa,dwd"))#['aed', 'apd'] 三个例外 \ ^ - 三个例外的不取消元字符的特殊功能 。
# print(re.findall("[1-9,a-z,A-Z]","12tyAD"))#['1', '2', 't', 'y', 'A', 'D']
# print(re.findall("[1-9a-zA-Z]","12tyAD"))#['1', '2', 't', 'y', 'A', 'D']和上面的使用方法是一样的
# print(re.findall("^iu","12tyADiu"))#[]
# print(re.findall("[^t]","12tyADtiu"))#['1', '2', 'y', 'A', 'D', 'i', 'u'][^]取反
# print(re.findall("[^4,5]","12345,6"))#['1', '2', '3', '6']取反包括,
# print(re.findall("[^45]","12345,6"))#['1', '2', '3', ',', '6']取反不包括 ','也被匹配出来了
# print(re.findall("\d{11}","151333333333a3333sd333151005183"))#['15133333333', '33315100518']\d匹配[0-9]
# print(re.findall("\s{3}asd","fkasd    asd"))#['   asd']\s取空白字符
# print(re.findall("\wasd","fkasd    asd"))#['kasd'] 匹配字母数字字符[1-9a-zA-Z]
# print(re.findall("\Wasd","fkasd    asd"))#[' asd'] 匹配非字母数字字符[^1-9a-zA-Z]
# print(re.findall("I","I am a LIST"))#['I', 'I']  我只想要代表我这个I
# print(re.findall("I\b","I am a LIST"))#[]  我只想要代表我这个I
# print(re.findall(r"I\b","I am a LIST"))#['I']  我只想要代表我这个I,为啥加了给r
# print(re.findall(r"I\b","I am a LI$T"))#['I', 'I']  空格和$都是特殊字符,逗号也算
# print(re.findall(r"\bI"," Iam a LI$T"))#['I'] 放到前面来获取也可以的
# print("***"*20)
# print(re.search("alux","alux0000alux000alux"))# <re.Match object; span=(0, 4), match='alux'> 返回第一个对象0-4的位置
# print(re.search("alux","alux0000alux000alux").group())# alux(字符串) 匹配出满足条件的第一个结果
# print(re.search("a\..d","apa.rddd").group())# a.rd 反斜杠可以将.的特殊意义去除
# print(re.findall("D\\\c","adhfD\c"))#自己搞的没明白
# print(re.findall("\\\\","adhfD\c"))#  ['\\'] 只匹配\,两个就对了 第一种
# print(re.findall(r"\\","adhfD\c"))#  ['\\'] 只匹配\,两个就对了 第二种加了r
# print(re.findall("\bI"," Iam a LI$T"))#[] 为什么匹配不到,演砸了?python解释器封装语法规范,所以re一次,python一次
# print(re.findall("\\bI"," Iam a LI$T"))#['I'] 不加r行不行 \到底代表啥?python解释器封装语法规范,所以re一次,python一次
#################
#() 帮我们做分组的
# print(re.search("(as)+","adjkfasasdasd").group()) #asas search 只能匹配前1个
# print(re.search("(as)|3","3as").group()) #3 |管道符,或滴意思
#举例子啦,先看一下会不嘿嘿正则分组~~~?P<name>格式
# ret = re.search("(?P<id>\d{3})/(?P<name>\w{3})","weeew34ttt123/ooo")#(?P<xx>)固定写法,组的名字。
# print(ret.group()) #  123/ooo 排除<> 等同于(\d{3})/(\w{3})
# print(ret.group("id"))# 123 运行id组
# print(ret.group("name"))# ooo 运行name组 /有效

#正则表达式的方法
#faindeall():所有结果都返回到列表里
#search():返回匹配到的第一个对象,对象里包含匹配信息,对象可以调用group方法,来拿匹配返回结果。
#match():只在字符串开始匹配也返回匹配到的第一个对象(Object),可调用group方法
#split
#sub
# print(re.match("asd","sddddasd"))#None
# print(re.match("asd","asdasdsddddasd"))#<re.Match object; span=(0, 3), match='asd'>
# print(re.match("asd","asdasdsddddasd").group())#asd
# print(re.split("[k,s]","asdkljf"))#['a', 'd', 'ljf']将从k开始分,结果从s进行分割
# print(re.split("[k,s]","sdkkljf"))#['', 'd', '', 'ljf']将从k,s进行分割,可以出现空kk中间,首位也有空
## print(re.sub("匹配规则","替换的内容","字符串"))
# print(re.sub("a..x","joke","aladkjsfassx"))#aladkjsfjoke *******
#自定义规则
# obj = re.compile("\.com")
# print(obj.findall("sdsdfasdf.com")) #['.com']可多次调用

作业,计算器
# 实现加减乘除及拓号优先级解析
# 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致