zoukankan      html  css  js  c++  java
  • python中的re模块

         re模块包含对正则表达式的支持.正则表达式是可以匹配文本片段的模式,最简单的正则表达式就是普通的字符串,可以匹配其自身。

    一  正则表达式中的元字符介绍:

            .  称为通配符,可以匹配任何字符(除了换行符)

            ^  脱字符,匹配字符串的开头

          $  匹配字符串的结尾

            *  匹配前面出现的正则表达式符号0次到多次

            + 匹配前面出现的正则表达式符号1次到多次

            ?  匹配前面出现的正则表达式符号0次或者1次

         {N} 匹配前面出现的正则表达式符号N次

       {M,N}匹配前面出现的正则表达式字符出现M到N次

          [...] 字符集,匹配[]中出现的任意一个字符

        [^...] 反转字符集,匹配除[]中外的任意字符

         [x-y] 匹配从x到y的字符

      re1|re2 可选模式,匹配|左边或者右边的表达式

         (...)  分组模式,子模式

        d与D  d匹配任意数字0-9同[0-9],D则相反,匹配任意的非数字

        w与W w匹配任意数字或者字符同[0-9a-zA-Z],W与w相反

        与B    匹配单词边界,B相反

        A,    A匹配字符串开头,匹配字符串结尾  

    二 re模块的方法

           compile(patten[,flag])  根据包含正则表达式的字符创建模式对象

           search(patten,string[,flag])  在字符串中寻找模式

           match(pattern,string[,flag])  在字符串开始出匹配模式

           split(patten,string[,maxsplit)   根据模式匹配项来分割字符

           findall(patten,string[,flag])  列出字符串中模式匹配的所有匹配项

           sub(patten,repl,string[,count=0])  将字符串中所有与模式匹配的部分用repl代替

           escape(string)  将字符串所有特殊字符转义

     特别注意,函数re.compile()将正则表达式转换为模式对象,可以实现更有效率的匹配。其实在使用search或者match进行匹配时他们会在内部将字符串转换为正则表达式时对象。如果使用complie()一次转换后,在每次匹配时就不用进行转换了,提高了匹配效率。 

         re.search()方法会方法一个MatchObject或者None,因此可以用作条件语句中。re,match()会在字符串开头进行匹配,返回MatchObject或者None .

    用例:

    # 用re.split()来分割单词
    some_text = 'alpha, beta,,,,gama delta'
    re.split(r'[, ]+',some_text)
    #结果为:['alpha', 'beta', 'gama', 'delta']
    
    # re.findall()以列表形式返回模式所有匹配项
    pat = re.compile(r'[a-zA-Z]+')
    text = '"Hm ....Err -- are you sure?"he said,sounding insecure'
    re.findall(pat,text)
    #结果为:['Hm', 'Err', 'are', 'you', 'sure', 'he', 'said', 'sounding', 'insecure']
    # re.findall()以列表形式返回刚才字符串的标点符号
    pat = re.compile(r'[?-.,"]+')  #注意-被转义
    text = '"Hm ....Err -- are you sure?"he said,sounding insecure'
    print re.findall(pat,text)
    #结果为:['"', '....', '--', '?"', ',']
    
    # re.sub()完成模式替换
    pat = re.compile(r'{name}')  #注意-被转义
    text = 'Dear {name}'
    print re.sub(pat,'Mr. Tange',text)
    

    re.escape()是一个很实用的函数。他可以对字符串中所有可能被解释为正则运算符的字符进行转义。比如当字符串很长或者字符串使用户输入的等。

    # re.escape()
    re.escape('www.python.org')
    # 'www\.python\.org'
    

    当执行re.match()和re.search()时,会返回MatchObject对象。该对象包括匹配模式的子字符信息,它还包含了那个模式匹配l子串的那部分信息。这些部分叫做组,group,

    group()中组的序号取决于它左侧括号数。组0就是整个子模式:如下面模式:

    # group()组对应的值
    pat = r'There (was a (wee) (cooper)) who (lived in Fyfe)'
    """
    组号      内容
    0      There was a wee cooper who lived in Fyfe
    1      was a wee cooper
    2      wee
    3      cooper
    4      lived in Fyfe
    """
    

     在group()方法中,如果没有给出组号,默认为0组,即为整个串。MatchObject对象的方法:

    group([group1,...])     获取给定子模式组的匹配项

    start([group])             返回给定组的匹配值开始值

    end([group])               返回给定组匹配的结束位置

    span([group])              返回一个组的开始和结束位置

    groups()                      返回一个元组,包含所有子模式组匹配的结果

    # 使用re.search()匹配
    pat = re.compile(r'www.(.*)..{3}')
    text = 'www.python.org'
    m = pat.search(text)
    print m.group()   # 'www.python.org'
    print m.group(1)  # 'python'
    print m.span(1)   # (4,10)
    print m.groups()  # ('python',)
    
    # 使用re.sub(),传递MatchObject对象作为参数
    # 把*something*用<em>sonthing</em>替换
    pattern = re.compile(r'*([^*]+)*')
    print pattern.sub(r'<em>1</em>','hello *world*')
    # 结果:hello <em>world</em>,上面的1表示MatchObject的组1
    

     另外,需要注意贪婪和非贪婪模式。重复运算符默认是贪婪的,这意味着他会竟可能多的匹配。如果要改为非贪婪,需要在重复运算符后面加上?,如+?

  • 相关阅读:
    docker mysql 主从配置
    在docker上安装运行mysql实例
    mongodb分片集搭建
    mongodb片健的选取及更改
    MySQL 5.7的多源复制
    percona-toolkit使用教程
    Python基础操作-集合
    nginx location 在配置中的优先级
    OpenResty知识汇集
    开源分布式日志框架
  • 原文地址:https://www.cnblogs.com/td15980891505/p/5972757.html
Copyright © 2011-2022 走看看