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

      

  • 相关阅读:
    MongoDB 启动和关闭
    java protostuff 序列化反序列化工具
    第一天
    第六章
    第六章
    第六章
    第六章
    第五章---面向对象---1.软件开发/2.异常处理/3.try...except的详细用法
    第五章-面向对象-1.元类介绍/2.自定义元类控制类的行为/3.控制类的实例化行为/4.控制类的实例化行为的应用
    第五章---面向对象---1.绑定方法与非绑定方法介绍/2.绑定方法与非绑定方法应用/3.反射/4.内置方法
  • 原文地址:https://www.cnblogs.com/negu/p/11715115.html
Copyright © 2020-2023  润新知