• python之re模块


    一、re模块与正则表达式

        今天我们要整理python里的re模块和正则表达式,正则表达式不仅在python领域,在整个编程届都占有举足轻重的地位。

      在没有正式介绍re模块之前我们需要先了解一下什么是正则表达式,它又与re模块有什么联系呢?

        简单介绍一下正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同;但不用担心,不被支持的语法通常是不常用的部分。如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了。

      正则表达式的用法   

       元字符
        w 匹配数字字母下滑线 word关键字 [a-zA-Z0-9_]
        d 匹配所有的数字 digit [0-9]
        s 匹配所有的空白符 回车/换行符 制表符 空格 space [ ]
            匹配换行符 回车
            匹配制表符 tab
            匹配空格
          W D S 和w d s取反
          [sS] [dD] [wW]是三组全集 意思是匹配所有字符
           表示单词的边界

            和转义字母相关的 元字符
          w d s( )  W D S

         ^ 与$
           ^ 匹配一个字符串的开始
           $ 匹配一个字符串的结束
      
        . 表示匹配 除换行符之外的所有字符

        [] 只要出现在中括号内的内容都可以被匹配
        [^] 只要不出现在中括号中的内容都可以被匹配
        有一些有特殊意义的元字符进入字符组中会回复它本来的意义 : . | [ ] ( )


        a|b 或 符合a规则的或者b规则的都可以被匹配
         如果a规则是b规则的一部分,且a规则比b规则要苛刻/长,就把a规则写在前面
        将更复杂的更长的规则写在最前面
        () 分组 表示给几个字符加上量词约束的需求的时候,就给这些量词分在一个组


      量词
        {n}表示 这个量词之前的字符出现n次
        {n,} 表示这个量词之前的字符至少出现n次
        {n,m} 表示这个量词之前的字符出现n-m次
        ? 表示匹配量词之前的字符出现 0次 或者 1次 表示可有可无
        + 表示匹配量词之前的字符出现 1次 或者 多次
        * 表示匹配量词之前的字符出现 0次 或者 多次

    二、re模块的使用

      首先我们在使用模块的时候先要导入模块,这时必不可少的步骤。

        1.findall   匹配列表中的每一个元素

    1 import re
    2 s="q6we798qw76sa45f"
    3 ret=re.findall("d",s)
    4 print(ret)
    5 #运行结果['6', '7', '9', '8', '7', '6', '4', '5']

        2.search  只会匹配到第一个符合的表达式(从左到右的顺序),得到的不是直接的结果,需要用group()方法来查看。这里需要注意当没有匹配到符合

       的表达式,直接打印会显示None,而通过group()方法来查看会报错

    1 import re
    2 s="as4d98qw7e"
    3 ret=re.search("d",s)
    4 print(ret)  #运行结果:<_sre.SRE_Match object; span=(2, 3), match='4'>
    5 print(ret.group())  #运行结果: 4

         findall 与 search 他们的用途都是用来查找,二者的区别在于findall 可以匹配全部结果,而search 只能匹配第一个结果。

        3.match 大体上与 search 用法相同,而不同点则是match默认在表达式前有 "^" 开头符号

    import re
    s = "123python456"
    re1 = re.search("d+$",s)
    re2 = re.match("d+$",s)
    print(re1.group())   #运行结果 : 456
    print(re2.group())     #报错 因为 match 在正则表达式前默认存在一个^,所以字符串s不是以数字开头数字结尾。

        4.split  切割.   

    1 import re
    2 s = "123python456"
    3 ret = re.split("d$",s)
    4 print(ret)    #运行结果:['123python45', '']

           5.sub 与 subn   替换   

    import re
    s= "123python456"
    re1 = re.sub("d","H",s)
    print(re1)    #运行结果 :HHHpythonHHH
    re2 = re.subn("d","H",s)
    print(re2)     #运行结果 :('HHHpythonHHH', 6)    subn会返回一个元组,元组中的第二个元素是替换的次数

        6.compile 编译  

          compile的作用是将正则表达式编译为字节码,当多次使用时不会多次便宜,它的特点就是节省时间

    1 import re
    2 s = "laixue1python2HAPPY"
    3 obj1= re.compile("d")
    4 re1 = obj1.findall(s)
    5 print(re1)    #运行结果 : ['1', '2']
    6 
    7 obj2 = re.compile("[a-z]+")
    8 print(obj2.search(s).group())   #运行结果: laixue

        7.finditer  返回一个存放匹配结果的迭代器,可以通过group()方法来查看结果,它的特点就是减少空间内存

     1 import re
     2 
     3 s = "13245python"
     4 ret = re.finditer("[a-z]",s)
     5 print(ret)    # 运行结果 :<callable_iterator object at 0x000001BADC72EAC8>  已经可以看出是迭代器了
     6 
     7 if ret.__iter__():
     8     print(True)
     9 else:
    10     print(False)
    11 # 判断返回是否为迭代器   运行结果为True
    12 
    13 print([i.group() for i in ret ])   #运行结果 :  ['p', 'y', 't', 'h', 'o', 'n']   所以finditer 可以用groud()方法来查看结果

      分组 ( )在re模块中的使用

         分组 ( ) 在正则表达式中表示分组将多个表达式统一管理后接量词来用,而在python的re模块中 " ( ) "有着不一样的用法

      1.分组 ( ) 表示优先级  

          在search中使用

    1 import re
    2 s = "132python456"
    3 ret = re.search("d+([a-z]+)d+",s)     
    4 print(ret.group())    #运行结果 : 132python456
    5 print(ret.group(1))     #运行结果 ; python
    6 #  当我们在表达式中添加分组表示优先级时,通过在group() 方法中添加参数可以优先获得结果

          在findall中使用

    1 import re
    2 s = "123python456"
    3 # ret = re.findall("d+([a-z]+)d+",s)
    4 # print(ret)     #  运行结果 : ['python']
    5 #  当 ( ) 在findall中使用时,而无法使用group()方法查看结果,这时默认匹配出( ) 内的结果
    6 ret = re.findall("(d+)([a-z]+)d+",s)
    7 print(ret)     # 运行结果 : [('123', 'python')] 
    8 #   当 多个( )同时使用时,会将结果以元组的形式添加到列表中

          在split中使用

    1 import re
    2 s = "132python456"
    3 ret = re.split("^d+([a-z]+)",s)
    4 print(ret)   #运行结果 : ['', 'python', '456']
    5 #  在split中使用时() 内的表达式被切割后会留下来。

      2.取消 分组( ) 优先级  " ?:"

    import re
    s = "123python456"
    ret = re.findall("(d+)(?:[a-z]+)(d+)",s)
    print(ret)      #运行结果 : [('123', '456')]
    #   当在( ) 内开头加入" ?: "字符时 , 表示取消优先级  

      3.分组( ) 的命名   " ?P< >"     

    1 import re
    2 s = "123python123"
    3 ret = re.search("(?P<a>d+)([a-z]+)(?P=a)",s)
    4 print(ret.group(0))  # 运行结果 : 123python123
  • 相关阅读:
    错误记录 git pull
    关于file_operations结构体
    20180911-Java实例01
    20180910-Java 文档注释
    20180907-Java Applet基础
    Elastic Stack生态圈
    关于我和本博客
    雨后的春日清晨
    charles 安装https证书
    css3不同文字大小底部对齐的完美解决方案
  • 原文地址:https://www.cnblogs.com/qq631243523/p/9490374.html
Copyright © 2020-2023  润新知