环境小硕的转行之路-19- re模块进阶

大纲

  • 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.search\findall\spilt中的使用

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

  

posted @ 2019-10-21 18:12  negu  阅读(145)  评论(0编辑  收藏  举报