大纲
- 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('')#即可去掉空字符
#正则表达式写的足够好的话,能够最大简化我们的操作.
#正则表达式重要到什么程度
#掌握作业中的所有内容(工作场合可能会用到)
#定制正则的情况(读懂正则表达式可以修改)
#做出一些公司特异性要求的修改