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) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致