大纲
- re模块的基础方法
- 在py中使用正则的特点和问题
- 使用正则表达式的技巧以及练习题
- 爬虫的例子
- random模块
re模块
import re #查找方法 #findall(regex function,str,flag) 正则表达式,字符串,flag参数.效果匹配所有,每一项都是列表中的一个元素. print(1,re.findall('d+','qweqweqw1231321321'))#输出列表['1231321321'] # search(regex function,str,,flag) ,只匹配从左到右的第一个,得到的不是直接的结果,而是一个变量,通过这个变量的.group()来获取结果. print(2,re.search('d+','qweqweqw1231321321'))#返回了一个变量,这是一个正则匹配的结果.若没有匹配结果则返回none,使用group会报错. # <_sre.SRE_Match object; span=(8, 18), match='1231321321'>,可以用group方法来获得match #多用于表单验证 # match(regex function,str,flag) 从头开始匹配,相当于search的regex function前面加上^. print(3,re.match('d+','qweqweqw1231321321'))#相当于re.search('^d','qweqweqw1231321321') #字符串处理的扩展:替换(replace):sub,subn,切割(split) # split(regex function,str) s = 'alex83taibai40egon25' print(re.split('d+',s))#根据一条正则表达式切割,匹配到的东西会被切掉 #sub(regex function,replace things,str,count=0,flag=0)#count为替换次数,按照正则规则去寻找要被替换掉的内容. print(4,re.sub('d+','hentai',s,count=2)) #subn print(5,re.subn('d+','hentai',s))#和sub类似但输出(替换结果,替换次数) #re模块的进阶 #compile(str) 节省使用正则表达式解决问题的时间,将正则表达式编译成字节码,在多次使用过程中不会多次编译. ret = re.compile('d+') print(ret.findall('wqhdiuqwheuiqhuwrhq2131231')) print(ret.findall(s))#一次编译,多次使用 #finditer('regex function',str) 节省使用正则表达式解决问题的空间 reiterator = re.finditer('d+',s)#把匹配内容放在迭代器里面.需要通过循环+group形式来取值. for i in reiterator: print(i.group()) #finditer和compile结合使用可以节省空间和时间.
分组在re.searchfindallspilt中的使用
import re str1 = '<a>jijiji</a>' #标签语言 后面会有专门的几天将html,和web息息相关 ret = re.search('>(w+)<',str1) print(ret.group())#>jijiji< print(ret.group(1))#jijiji #进阶 ret = re.search('<(w+)>(w+)</(w+)>',str1) print(ret.group())#<a>jijiji</a> print(ret.group(1))#a print(ret.group(2))#jijij print(ret.group(3))#a #group中的数字参数代表取各个分组之中的内容. rret = re.findall('>(w+)<',str1) print(rret)#['jijiji'] #findall也可以顺利取到分组中的内容,有一个特殊的语法:优先显示分组中的内容. #出现问题,例如匹配小数的时候 ret1 = re.findall('d+(.?d+)?','1.23') print(ret1)#['.23'] 优先显示括号里面的数 #取消分组优先 ret2 = re.findall('d+(?:.?d+)?','1.23')#加上?:取消分组优先,py代码和正则表达式之间的约定. print(11,ret2) ret3 = re.split('(d+)','negu22alex83egon33') print(ret3)#['negu', '22', 'alex', '83', 'egon', '33', ''] 会将分组里的东西留下来. #分组命名(?P<name>) ret4 = re.search('>(?P<content>w+)<',str1) print(ret4.group(1)) print(ret4.group('content'))#都拿到了jijiji wstr = '<a>jijiji</b>' ret5 = re.search('<(?P<tab>w+)>(w+)</(?P=tab)>',wstr) print(ret5)#none 单纯利用正则的手段判断前后tab是否一致
使用正则表达式的一些技巧
import re #需求从算式中取整数 ret = re.findall('d+','4*8*7-1800*47/5+44.5') print(ret)#把小数分割了 #需要匹配的内容太没有特点了,容易和其它内容混在一起. #想要精准取到整数而过滤掉小数. ret1 = re.findall(r'd+.d+|d+','4*8*7-1800*47/5+44.5') #1.先把小数匹配成元素,这样不会匹配到错误的结果了 print(ret1)#44.5变成了列表中的一个元素,可以用py去掉浮点数. ret2 = re.findall(r'd+.d+|(d+)','4*8*7-1800*47/5+44.5') print(ret2)#小数直接变成空字符了. ret.remove('')#即可去掉空字符 #正则表达式写的足够好的话,能够最大简化我们的操作. #正则表达式重要到什么程度 #掌握作业中的所有内容(工作场合可能会用到) #定制正则的情况(读懂正则表达式可以修改) #做出一些公司特异性要求的修改