zoukankan      html  css  js  c++  java
  • re模块(正则表达式)

    re模块

    作用:取文本或者字符串内找你所需要的东西

    
    import re
    re.findall(参数一,参数二,参数三)  #暂时用到前两个,第一个为正则表达式,第二个为字符串,也就是被搜索的文本
    
    
    
    

    ^元字符

    匹配规则:字符串开始位置与匹配规则符合就匹配,否则不匹配,匹配开头的,也就是说他只从开头找

    ^元字符如果写到[]字符集里就是反取

    import re
    a = re.findall("^匹配规则", "匹配规则这个字符串是否匹配")  # 字符串开始位置与匹配规则符合就匹配,否则不匹配
    print(a)
    #打印出 ['匹配规则']
    [^a-z]反取
    
    import re
    a = re.findall("[^a-z]", "匹配s规则这s个字符串是否s匹配f规则则re则则则")  # 反取,匹配出除字母外的字符
    print(a)
    #['匹配规则']
    

    $元字符

    匹配规则:字符串结束位置与匹配规则符合就匹配,否则不匹配

    匹配字符串末尾,在多行模式中匹配每一行的末尾

    import re
    a = re.findall("匹配规则$", "这个字符串是否匹配规则")  # 字符串结束位置与匹配规则符合就匹配,否则不匹配
    print(a)
    #['匹配规则']
    

    * 元字符

    匹配规则:需要字符串里完全符合匹配规则,就匹配,(规则里的元字符)前面的一个字符可以是0个或多个原本字符,匹配前一个字符0或多次,贪婪匹配前导字符有多少个就匹配多少个很贪婪,如果规则里只有一个分组,尽量避免用否则会有可能匹配出空字符串

    import re
    # 需要字符串里完全符合,匹配规则,就匹配,(规则里的*元字符)前面的一个字符可以是0或多个原本字符
    a = re.findall("匹配规则*", "这个字符串是否匹配规则则则则则")
    print(a)
    
    #['匹配规则则则则则']
    

    + 元字符

    匹配规则:需要字符串里完全符合匹配规则,就匹配,(规则里的+元字符)前面的一个字符可以是1个或多个原本字符匹配前一个字符1次或无限次,贪婪匹配前导字符有多少个就匹配多少个很贪婪

    import re
    # 需要字符串里完全符合,匹配规则,就匹配,(规则里的?元字符)前面的一个字符可以是0个或1个原本字符
    a = re.findall("匹配规则?", "匹配规这个字符串是否匹配规则则则则则")
    print(a)
    
    #['匹配规', '匹配规则']
    

    {}元字符(范围)

    需要字符串里完全符合,匹配规则,就匹配,(规则里的 {} 元字符)前面的一个字符,是自定义字符数,位数的原本字符

    {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次

    {0,}匹配前一个字符0或多次,等同于*元字符
    {1,}匹配前一个字符1次或无限次,等同于+元字符
    {0,1}匹配前一个字符0次或1次,等同于?元字符

    import re
    # {m}匹配前一个字符m次,{m,n}匹配前一个字符m至n次,若省略n,则匹配m至无限次
    a = re.findall("匹配规则{3}", "匹配规这个字符串是否匹配规则则则则则")
    print(a)
    #['匹配规则则则']
    

    []元字符(字符集)

    需要字符串里完全符合,匹配规则,就匹配,(规则里的 [] 元字符)对应位置是[]里的任意一个字符就匹配

    字符集。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。[^abc]表示取反,即非abc。
    所有特殊字符在字符集中都失去其原有的特殊含义。用反斜杠转义恢复特殊字符的特殊含义。

    import re
    # 需要字符串里完全符合,匹配规则,就匹配,(规则里的 [] 元字符)对应位置是[]里的任意一个字符就匹配
    a = re.findall("匹配[a,b,c]规则", "匹配a规则这个字符串是否匹配b规则则则则则")
    print(a)
    
    #['匹配a规则', '匹配b规则']
    

    反斜杠后边跟普通字符实现特殊功能(预定义字符)

    d  匹配任何十进制数,它相当于类[0-9]
    d+ 匹配一位或者多位数的数字时用
    D 匹配任何非数字字符,它相当于类[^0-9]
    s 匹配任何空白字符,它相当于类[	
    
    fv]
    S 匹配任何非空白字符,它相当于类[^	
    
    fv]
    w 匹配包括下划线在内任何字母数字字符,它相当于类[a-zA-Z0-9_]
    W 匹配非任何字母数字字符包括下划线在内,它相当于类[^a-zA-Z0-9_]
    () 分组 也就是分组匹配,()里面的为一个组也可以理解成一个整体
       如果()后面跟的是特殊元字符如 (adc)* 那么*控制的前导字符就是()里的整体内容,    不再是前导一个字符
    |元字符(或),或就是前后其中一个符合就匹配
    

    re模块中常用功能函数

    1.一种是直接在函数里书写规则

    2.另一种是先将正则表达式的字符串形式编译为Pattern实例,然后使用Pattern实例处理文本并获得匹配结果(一个Match实例),最后使用Match实例获得信息,进行其他的操作。

    import re
    
    # 将正则表达式编译成Pattern对象
    pattern = re.compile(r'hello')
    
    # 使用Pattern匹配文本,获得匹配结果,无法匹配时将返回None
    match = pattern.match('hello world!')
    
    if match:
        # 使用Match获得分组信息
        print(match.group()
    
    

    re.math(pattern ,strin,flags)函数

    match,从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
    match(pattern, string, flags=0)

    • pattern: 正则模型
    • string : 要匹配的字符串
    • falgs : 匹配模式

    注意:match()函数 与 search()函数基本是一样的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个合规则的字符串

    import re
    # 无分组
    origin = "hello egon bcd egon lge egon acd 19"
    r = re.match("hw+", origin)  # match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
    print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
    print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
    print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
    '''
    hello
    ()
    {}
    '''
    
    # 有分组
    # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
    r = re.match("h(w+)", origin)  # match,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
    print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
    print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
    print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
    
    '''
    hello
    ('ello',)
    {}
    '''
    # 有两个分组定义了key
    # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
    # ?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
    r = re.match("(?P<n1>h)(?P<n2>w+)", origin)
    print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
    print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
    print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
    '''
    print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
    hello
    ('h', 'ello')
    {'n1': 'h', 'n2': 'ello'}
    '''
    
    

    re.search(pattern,string,flags)函数

    search,浏览全部字符串,匹配第一符合规则的字符串,浏览整个字符串去匹配第一个,未匹配成功返回None

    search(pattern, string, flags=0)

    • pattern: 正则模型
    • string : 要匹配的字符串
    • falgs : 匹配模式

    注意:match()函数 与 search()函数基本是一样的功能,不一样的就是match()匹配字符串开始位置的一个符合规则的字符串,search()是在字符串全局匹配第一个合规则的字符串

    import re
    # 无分组
    origin = "hello alex bcd alex lge alex acd 19"
    # search浏览全部字符串,匹配第一符合规则的字符串,浏览整个字符串去匹配第一个,未匹配成功返回None
    r = re.search("aw+", origin)
    print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
    print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
    print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
    
    '''
    alex
    ()
    {}
    '''
    # 有分组
    # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
    r = re.search("a(w+).*(d)", origin)
    print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
    print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
    print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
    '''
    alex bcd alex lge alex acd 19
    ('lex', '9')
    {}
    '''
    # 有两个分组定义了key
    # 为何要有分组?提取匹配成功的指定内容(先匹配成功全部正则,再匹配成功的局部内容提取出来)
    # ?P<>定义组里匹配内容的key(键),<>里面写key名称,值就是匹配到的内容
    r = re.search("a(?P<n1>w+).*(?P<n2>d)", origin)
    print(r.group())  # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来
    print(r.groups())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
    print(r.groupdict())  # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
    '''
    alex bcd alex lge alex acd 19
    ('lex', '9')
    {'n1': 'lex', 'n2': '9'}
    '''
    
    

    re.findall(pattern,string,flags)函数

    findall(pattern, string, flags=0)

    • pattern: 正则模型
    • string : 要匹配的字符串
    • falgs : 匹配模式

    浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中,未匹配成功返回空列表

    注意:一旦匹配成,再次匹配,是从前一次匹配成功的,后面一位开始的,也可以理解为匹配成功的字符串,不在参与下次匹配

    import re
    # 无分组
    r = re.findall("d+wd+", "a2b3c4d5")  # 浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
    print(r)  # 注意:匹配成功的字符串,不在参与下次匹配,所以3c4也符合规则但是没匹配到
    ['2b3', '4d5']
    注意:如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表
    import re
    # 无分组
    r = re.findall("", "a2b3c4d5")  # 浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
    print(r)  # 注意:如果没写匹配规则,也就是空规则,返回的是一个比原始字符串多一位的,空字符串列表
    
    ['', '', '', '', '', '', '', '', '']
    注意:正则匹配到空字符的情况,如果规则里只有一个组,而组后面是*就表示组里的内容可以是0个或者多过,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白)所以尽量避免用*否则会有可能匹配出空字符串
    
    import re
    r = re.findall("a*", "a2b")  # a*表示0-无穷个,因此会匹配空字符串
    print(r) 
    
    ['a', '', '']
    无分组:匹配所有合规则的字符串,匹配到的字符串放到一个列表中
    
    import re
    # 无分组
    origin = "hello alex bcd alex lge alex acd 19"
    r = re.findall("aw+", origin)  # 浏览全部字符串,匹配所有合规则的字符串,匹配到的字符串放到一个列表中
    print(r)
    ['alex', 'alex', 'alex', 'acd']
    有分组:只将匹配到的字符串里,组的部分放到列表里返回,相当于groups()方法
    import re
    origin = "hello alex bcd alex lge alex acd 19"
    r = re.findall("a(w+)", origin)  # 有分组:只将匹配到的字符串里,组的部分放到列表里返回
    print(r)
    ['lex', 'lex', 'lex', 'cd']
    多个分组:只将匹配到的字符串里,组的部分放到一个元组中,最后将所有元组放到一个列表里返
    
    相当于在group()结果里再将组的部分,分别,拿出来放入一个元组,最后将所有元组放入一个列表返回
    import re
    origin = "hello alex bcd alex lge alex acd 19"
    # 分组中有分组:只将匹配到的字符串里,组的部分放到一个元组中,先将包含有组的组,看作一个整体也就是一个组,把这个整体组放入一个元组里,然后在把组里的组放入一个元组,最后将所有组放入一个列表返回
    r = re.findall("(a)(w+(e))", origin)
    print(r)
    [('a', 'le', 'e'), ('a', 'le', 'e'), ('a', 'le', 'e')]
    ?:在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()
            import re
    origin = "hello alex bcd alex lge alex acd 19"
    # ?:在有分组的情况下,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()
    b = re.findall("a(?:w+)", origin)
    print(b)
    ['alex', 'alex', 'alex', 'acd']
    
    

    re.split(patter,string,maxsplot)函数

    根据正则匹配分割字符串,返回分割后的一个列表

    split(pattern, string, maxsplit=0, flags=0)

    • pattern: 正则模型
    • string : 要匹配的字符串
    • maxsplit:指定分割个数
    • flags : 匹配模式

    按照一个字符将全部字符串进行分割

    
    import re
    origin = "hello alex bcd alex lge alex acd 19"
    r = re.split("a", origin)  # 根据正则匹配分割字符串
    print(r)
    
    ['hello ', 'lex bcd ', 'lex lge ', 'lex ', 'cd 19']
    将匹配到的字符串作为分割标准进行分割
    
    import re
    origin = "hello alex bcd alex lge alex 2acd 19"
    r = re.split("aw+", origin)  # 根据正则匹配分割字符串
    print(r)
    
    ['hello ', ' bcd ', ' lge ', ' 2', ' 19']
    
          
    

    re.sub(pattern,repl,string,count) 函数

    替换匹配成功的指定位置字符串

    sub(pattern, repl, string, count=0, flags=0)

    • pattern: 正则模型

    • repl : 要替换的字符串

    • string : 要匹配的字符串

    • count : 指定匹配个数

    • flags : 匹配模式

      import re
      origin = "hello alex bcd alex lge alex acd 19"
      r = re.sub("a", "替换", origin)  # 替换匹配成功的指定位置字符串
      print(r)
      
      hello 替换lex bcd 替换lex lge 替换lex 替换cd 19
      
      

      re.subn(pattern,repl,string,count,flags) 函数

      替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受

      subn(pattern, repl, string, count=0, flags=0)

      • pattern: 正则模型

      • repl : 要替换的字符串

      • string : 要匹配的字符串

      • count : 指定匹配个数

      • flags : 匹配模式

        import re
        origin = "hello alex bcd alex lge alex acd 19"
        a, b = re.subn("a", "替换", origin)  # 替换匹配成功的指定位置字符串,并且返回替换次数,可以用两个变量分别接受
        print(a)
        print(b)
        
        hello 替换lex bcd 替换lex lge 替换lex 替换cd 19
        
        

        注意事项

        1. r原生字符:让在python里有特殊意义的字符如,转换成原生字符(就是去除它在python的特殊意义),不然会给正则表达式有冲突,为了避免这种冲突可以在规则前加原始字符r
        2. 正则表达式,返回类型为表达式对象的,如:<_sre.SRE_Match object; span=(6, 7), match='a'>,返回对象时,需要用正则方法取字符串,方法有:
          1. group() # 获取匹配到的所有结果,不管有没有分组将匹配到的全部拿出来,有参取匹配到的第几个如2
          2. groups() # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分的结果
          3. groupdict() # 获取模型中匹配到的分组结果,只拿出匹配到的字符串中分组部分定义了key的组结果
        3. 匹配到的字符串里出现空字符:注意:正则匹配到空字符的情况,如果规则里只有一个组,而组后面是就表示组里的内容可以是0个或者多过,这样组里就有了两个意思,一个意思是匹配组里的内容,二个意思是匹配组里0内容(即是空白)所以尽量避免用否则会有可能匹配出空字符串
        4. ()分组:注意:分组的意义,就是在匹配成功的字符串中,再提取()里的内容,也就是组里面的字符串
        5. ?:在有分组的情况下findall()函数,不只拿分组里的字符串,拿所有匹配到的字符串,注意?:只用于不是返回正则对象的函数如findall()
  • 相关阅读:
    推荐两款好用的反编译工具(Luyten,Jadx)
    在windows上运行linux
    Spring IOC的理解
    Django 13 admin和auth系统、权限问题
    Django 12 中间件、上下文处理器和admin后台
    Django 11 form表单(状态保持session、form表单及注册实现)
    Django 10 GET和POST(HttpRequest对象,GET和POST请求,文件上传,HttpResponse对象的cookie)
    Django 09 博客小案例
    Django 解答 01 (pycharm创建项目)
    Django 08 Django模型基础3(关系表的数据操作、表关联对象的访问、多表查询、聚合、分组、F、Q查询)
  • 原文地址:https://www.cnblogs.com/bladecheng/p/11019477.html
Copyright © 2011-2022 走看看