zoukankan      html  css  js  c++  java
  • Python之路【第六篇】:Python基础(21)——正则表达式

    正则表达式

     字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。

        正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。
        下面这张图展示了使用正则表达式匹配的流程

    python的re模块

    Python通过re模块提供对正则表达式的支持。使用re的一般步骤是先将正则表达式的字符串形式编译为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模块的常用方法

    re.compile(strPattern[, flag])

        参数:
            strPattern:正则表达式
            flag:匹配模式,可选值有
                re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)
                M(MULTILINE): 多行模式,改变'^'和'$'的行为(参见上图)
                S(DOTALL): 点任意匹配模式,改变'.'的行为
                L(LOCALE): 使预定字符类 w W  B s S 取决于当前区域设定
                U(UNICODE): 使预定字符类 w W  B s S d D 取决于unicode定义的字符属性
                X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。
        返回值:Pattern对象是一个编译好的正则表达式,通过Pattern提供的一系列方法可以对文本进行匹配查找
        以下的方法既可以是Pattern对象的实例方法也可以是re模块的方法,语法稍有不同

    match(string[, pos[, endpos]]) | re.match(pattern, string[, flags])

        这个方法将从string的pos下标处起尝试匹配pattern;如果pattern结束时仍可匹配,则返回一个Match对象;如果匹配过程中pattern无法匹配,或者匹配未结束就已到达endpos,则返回None。
        pos和endpos的默认值分别为0和len(string);re.match()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。
        注意:这个方法并不是完全匹配。当pattern结束时若string还有剩余字符,仍然视为成功。想要完全匹配,可以在表达式末尾加上边界匹配符'$'。 
        参数:
        string:要匹配的字符串
        pos:匹配的开始下标
        endpos:匹配的结束下标
        pattern:正则表达式
        flags:匹配模式
        返回值:如果匹配成功返回match对象,否则返回None

    search(string[, pos[, endpos]]) | re.search(pattern, string[, flags])

        这个方法用于查找字符串中可以匹配成功的子串。从string的pos下标处起尝试匹配pattern,如果pattern结束时仍可匹配,则返回一个Match对象;若无法匹配,则将pos加1后重新尝试匹配;直到pos=endpos时仍无法匹配则返回None。
    pos和endpos的默认值分别为0和len(string));re.search()无法指定这两个参数,参数flags用于编译pattern时指定匹配模式。 
        参数:同match
        返回值:同match
     
        我们通过一个实例来看一下两个方法的区别
    >>> import re
    >>> s = 'hello world'
    >>> print(re.match('ello', s))
    None
    >>> print(re.search('ello',s ))
    <_sre.SRE_Match object; span=(1, 5), match='ello'>
        说明:可以看到macth只匹配开头,开头不匹配,就不算匹配到,search则可以从中间,只要能有匹配到就算匹配
    findall(string[, pos[, endpos]]) | re.findall(pattern, string[, flags])
        搜索string,以列表形式返回全部能匹配的子串。有点像search的扩展,把所有匹配的子串放到一个列表
        参数:同match
        返回值:所有匹配的子串,没有匹配则返回空列表
    >>> import re             
    >>> s = 'one1two2three3four4'
    >>> re.findall('d+', s)
    ['1', '2', '3', '4']

    split(string[, maxsplit]) | re.split(pattern, string[, maxsplit]):

        按照匹配字子串将字符串进行分割,返回分割收的列表
        参数:
         string:要分割的字符串
         pattern:正则表达式
        maxsplit:最大分割次数
        返回值:分割后的列表
        实例
    >>> import re                 
    >>> s = 'one1two2three3four4'
    >>> re.split('d+', s)
    ['one', 'two', 'three', 'four', '']

    sub(repl, string[, count]) | re.sub(pattern, repl, string[, count])

        使用repl替换string中匹配的每一子串
        参数:
        repl:替换的字符串或方法,这里需要说一下这个方法,方法接收macth对象,方法的返回值作为替换的字符串,换句话就是经过处理的字符串。
        string:要进行替换的字符串
        pattern:正则表达式
        count:替换的次数
        实例:对于repl是个方法的情况,正好这次作业用到,用来替换多个则很难过福号的情况。假设我们有一个四则运算表达式 '--(1.1+1+1-(-1)-(1+1+(1+1+2.2)))+-----111+--++--3-+++++++---+--- 1+4+4/2+(1+3)*4.1+(2-1.1)*2/2*3',遵循奇数个负号等于正否则为负的原则进行替换,我们可以这样
    if __name__ == '__main__':
        import re
        s = '--(1.1+1+1-(-1)-(1+1+(1+1+2.2)))+-----111+--++--3-+++++++---+---1+4+4/2+(1+3)*4.1+(2-1.1)*2/2*3'
        def replace_sign(expression):
            '''
            替换多个连续+-符号的问题,例如+-----,遵循奇数个负号等于正否则为负的原则进行替换
            :param expression: 表达式,包括有括号的情况
            :return: 返回经过处理的表达式
            '''
            def re_sign(m):
                if m:
                    if m.group().count('-')%2 == 1:
                        return '-'
                    else:
                        return '+'
                else:
                    return ''
            expression = re.sub('[+-]{2,}', re_sign, expression)
            return expression
     
        s = replace_sign(s)
        print(s)

    执行结果

    24 +(1.1+1+1-(-1)-(1+1+(1+1+2.2)))-111+3-1+4+4/2+(1+3)*4.1+(2-1.1)*2/2*3
  • 相关阅读:
    Qt进程间通信
    reinterpret
    vs调试技巧
    利用QSystemSemaphore和QSharedMemory实现进程间通讯
    QLocalSocket
    QShareMemory
    qt动态库实现无边框窗体的消息处理 nativeEvent的使用
    BCB6常用快捷键
    1219个人总结
    冲刺二 12.6
  • 原文地址:https://www.cnblogs.com/jiangnanmu/p/5595467.html
Copyright © 2011-2022 走看看