day20:正则表达式
单个字符的匹配findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回 预定义字符集(8)d 匹配数字 D 匹配非数字 w 匹配数字字母下划线 W 匹配非数字或字母或下划线 s 匹配任意的空白符 S 匹配任意的非空白符 n 匹配一个换行符 t 匹配一个制表符 # ### 预定义字符集 # d 匹配数字 strvar = "sdfsdf*(&*(&(2ui3" lst = re.findall(d,strvar) print(lst) D 匹配非数字 strvar = D w 匹配字母数字下划线 strvar = sadf*)(*_)456你你好w W 匹配非字母或数字或下划线 strvar = W(lst) s 匹配任意的空白符 (n t r ' ') strvar = " s S 匹配任意非空白符 strvar = abdd S n 匹配一个换行符 strvar = """ """ lst = re.findall(rn t 匹配一个制表符 strvar = """ tprint(lst) 字符组必须从字符组列举出来的字符当中抽取,默认一个,如果没有返回空. ### 字符组[] 必须从字符组列举出来的字符当中抽取,如果没有返回空 strvar = abpoiuc[abc]print(lst) ['a','b','c'] print(re.findall('a[abc]b',aab abb acb adb')) aab abb acb a[0123456789]ba1b a2b a3b acb ayb a1b a2b a3b - 代表到,代表的是范围 0-9 0到9这么多的数字 a[0-9]b')) a-g => abcdefg a[abcdefg]ba1b a2b a3b acb ayb adb acb adb a[a-g]b')) acb adb a-z => 26个小写字母 a[a-z]b acb ayb adb A-G => ABCDEFG a[ABCDEFG]ba1b a2b a3b aAb aDb aYbaAb aDb a[A-G]baAb aDb A-Z=> 26个大写字母 a[A-Z]baAb aDb aYb a[0-9a-zA-Z]ba-b aab aAb aWb aqba1b aab aAb aWb aqb a1b 0-z 不会单纯的匹配小写大写字母和数字,还会匹配到特殊的符号,比如_和@ a[0-z]ba_ba@b aab aAb aWb aqba1b aab aAb aWb aqb a1b a[0-9][*#/]ba1/b a2b a29b a56b a456ba1/b ^ 除了,在字符组当中,开头的位置使用 a[^-+*/]ba%b ccaa*bda&bd")) a%b a&b 匹配 ^ - 如果想要匹配^ - 需要前面加上进行转义 lst = re.findall(a[^-]b",1)">a+b a-b a^b) ['a-b','a^b'] 匹配 / 匹配 """b 本身也是转义字符 : 退格(把光标向左移动一位)ababprint(lst[0]) 多个字符的匹配量词(4)?? 0-1 +? 1-N *? 0-N {m,n}? M-N 量词 '''1) ? 匹配0个或者1个a ''' a?babbzab abb aab ab b ab ab b ab 2) + 匹配1个或者多个a a+bb ab aaaaaab abb ab aaaaaab ab 3) * 匹配0个或者多个a a*bb ab aaaaaab abbbbbbb b ab aaaaaab ab b b b b b b 4) {m,n} 匹配m个至n个a 1 <= x <= 3 a{1,3}baaab ab aab abbb aaz aabb aaab ab aab ab aab {2,} 至少2次 a{2,}b aaab aab aaba{2}b aab aab aab 贪婪匹配和非贪婪匹配1.贪婪匹配 : 默认向更多次数匹配(回溯算法) 练习题 strvar = 刘能和刘老根和刘铁柱子111子222 lst = re.findall(刘. ['刘能','刘老','刘铁'] (lst) lst = re.findall(刘.?刘.+ ['刘能和刘老根和刘铁柱子111子222'] 刘.*刘.{4,}子 ['刘能和刘老根和刘铁柱子111子'] 非贪婪匹配 lst = re.findall(刘.?? ['刘','刘','刘'] 刘.+?刘.*? ['刘能和刘老根和刘铁柱子'] print(lst) 边界符b 本身也是转义字符 : 退格(把光标向左移动一位) 右边界 strvar = word pwd scfdb ['d','d'] .*db ['word pwd'] .*?db ['word',' pwd'] 左边界 lst = re.findall(rbw ['w'] bw.* ['word pwd scf'] bw.*?bw.* ['word pwd '] bw.*? ['word '] S 匹配的是非空白符 lst = re.findall(rbwS* ['word'] ^ $:开头/结尾^ 匹配字符串的开始(必须以... 开头) strvar = 大哥大嫂大爷" 大. ['大哥','大嫂','大爷'] ^大. ['大哥'] 大.$ ['大爷'] ^大.$ [] ^大.*?$ ['大哥大嫂大爷'] ^大.*?大$^大.*?爷$ ['大哥大嫂大爷'] ^g.*? giveme 1gfive gay ['giveme '] five$aassfive')) ['five'] ^giveme$giveme')) ['giveme'] giveme giveme')) ['giveme','giveme'] ^g.*e')) ['giveme 1gfive'] 匹配分组分组练习(用圆括号) .*?_goodwusir_good alex_good secret男_good ['wusir_good',' alex_good',' secret男_good'] () 优先显示括号里面的内容 (.*?)_good ['wusir',' alex',' secret男'] ?: 取消显示括号里面的内容 (?:.*?)_good | 代表或,a|b 匹配字符a 或者 匹配字符b . 把字符串长的写在前面,字符串短的写在后面 strvar = abcdefga|b在使用|的时候,把不容易匹配到的字符串放到前面,把容易匹配到的放到后面 strvar = abciuiuabcdwerewr lst1 = re.findall(abc|abcd ['abc','abc'] lst2 = re.findall(abcd|abc 把不容易匹配的放到前面 ['abc','abcd'] (lst1) print(lst2) 匹配分组练习. 除了n,匹配所有字符 1.小数和整数 strvar = .34 .... 78. 78.12 56.3 .3 .4 .5 匹配小数 lst = re.findall(rd+.d+ 匹配小数和整数 lst = re.findall(rd+.d+|d+ 分组来表达小数和整数 lst = re.findall(rd+(.d+)?(lst) lst = re.findall(rd+(?:.d+)? ['34','78','78.12','56.3','3','4','5'] 2.匹配135或171的手机号 匹配135或171的手机号 strvar = 13566668888 17166668888(?:135|171)d{8} ['13566668888','17166668888'] 用^$卡死长度,只能是一个手机号,不能是多个 strvar = 13566668888^(?:135|171)d{8}$ ['13566668888'] 3.匹配www.baidu.com 或者 www.oldboy.com strvar = www.baidu.com www.lagou.com www.oldboy.com(?:www).(?:baidu|oldboy).(?:com) search 的用法 strvar = obj = re.search(rwww.(baidu|oldboy).(com) 返回的是匹配到的结果 res = obj.group() (res) 通过group和下标可以获取到括号的内容(了解) print(obj.group(1)) print(obj.group(2)) 返回的是括号分组里面的内容 res = obj.groups() print(res) 4.findall和search的区别 1.findall 是把所有符合条件的内容都匹配出来放到列表里 5."5*6-7/3" 匹配 5*6 或者 7/3 算出最后的结果 strvar = 5*6-7/3" 匹配5*6 obj = re.search(rd+[*/]d+(obj) strvar1 =print(strvar1,type(strvar1),1)"><===>") 5*6 <class 'str'> <===> 计算5*6 num1,num2 = strvar1.split(*(num1,num2) strvar2 = str(int(num1) * int(num2)) print(strvar2,type(strvar2)) "30" 替换5*6 为字符串30 strvar3 = strvar.replace(strvar1,strvar2) print(strvar3,type(strvar3)) 30-7/3 <class 'str'> 匹配7/3 obj = re.search(r(obj) strvar4 =print(strvar4) 7/3 计算7/3 num1,num2 = strvar4.split(/) strvar5 = str(int(num1) /(strvar5,type(strvar5)) 替换7/3 为字符串2.333333333333 strvar6 = strvar3.replace(strvar4,strvar5) (strvar6,type(strvar6)) 计算 30-2.3333333333333335 得出最后的结果 num1,num2 = strvar6.split(-) res = float(num1) - float(num2) print(res) 命名分组反向引用strvar = <div> 今天天气不错~ </div><(.*?)>(.*?)<(.*?)> [('div',' 今天天气不错~ ','/div')] 反向引用 : 在匹配到的值,在引用一次 1 把第一个小括号里面的内容,拿出来在匹配一下'''<(.*?)>(.*?)<(/1)> 1 代表反向引用第一个括号 2代表反向引用第二个括号 strvar = a1b2cab strvar = "f1z2pfz" obj = re.search(r(.*?)d(.*?)d(.*?)12print(obj) <_sre.SRE_Match object; span=(0,7),match='a1b2cab'> 获取匹配到的内容 res1 =print(res1) a1b2cab 获取分组里面的内容 res2 = obj.groups() print(res2) ('a','c') 命名分组(?P<组名>正则表达式) 给这个组起一个名字 (?P=组名) 引用之前组的名字,把该组名匹配到的内容放到当前位置 """ 方法一 strvar = (?P<tag1>.*?)d(?P<tag2>.*?)d(?P<tag3>.*?)12(res1) (res2) 方法二 strvar = (?P<tag1>.*?)d(?P<tag2>.*?)d(?P<tag3>.*?)(?P=tag1)(?P=tag2)print(res2) ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |