• 编译模式


    一个模式可以通过编译(变成一个内部的表达)来提高检索的速度。这一步不是强制的,而是推荐对大量的文本进行使用。让我们看看findall的正则模式,而后用编译的模式(rgx):

    正则模式如下:

    >>> re.findall(“[Hh]ello”,”Hello world, hello Python,!”)

    [’Hello’, ’hello’]

    编译的模式如下:

    >>> rgx = re.compile(“[Hh]ello”)

    >>> rgx.findall(“Hello world, hello Python,!”)

    [’Hello’, ’hello’]

    编译后的模块(这里就是rgx)有许多在re模块中的方法:

    >>> rgx = re.compile(“[Hh]ello”)

    >>> rgx.search(“Hello world, hello Python,!”)

    <_sre.SRE_Match object at 0xb6f494f0>

    >>> rgx.match(“Hello world, hello Python,!”)

    <_sre.SRE_Match object at 0xb6f493d8>

    >>> rgx.findall(“Hello world, hello Python,!”)

    [’Hello’, ’hello’]

    组(Groups)

     有时你需要多于一个模式相匹配,这可以通过分组完成。组是由一组括号(“()”)来标记的。组可以被“捕获”(“命名”或“无名”)和“非捕获”,它们之间的区别,以后将会明确的。
    一个“捕获”的组用于当你需要提取一组的内容时。组可以被groups捕获。不要混淆group与groups。

         正则表达式字符串中(也就是模式中)的第一对括号就是第1组,第二对括号就是第2组。想group()匹配对象方法传入整数1或者2,就可以取得匹配文本的不同部分。向group()传入0或者不传入参数,将返回整个匹配的文本。例如:

    >>> import re
    >>> seq = "ATATAAGATGCGCGCGCTTATGCGCGCA"
    >>> rgx = re.compile("(GC){3,}(TTAT)")   #这里模式"(GC){3,}(TTAT)"中,第一个分组就是(GC),第二个分组也就是(TTAT)
    >>> result = rgx.search(seq)

    >>> result.group(1)  #传入整数1,获得第一个分组的匹配结果
    'GC'
    >>> result.group(2) #传入整数2,获得第二个分组的匹配结果
    'TTAT'
    >>> result.group()  #不传入参数,返回整个匹配的结果
    'GCGCGCGCTTAT'
    >>> result.groups()  #注意group()和groups()的区别,group() 不传入参数,返回的是整个匹配的结果,而groups()返回的是模式中每个分组匹配结果组成的元组。
    ('GC', 'TTAT')

    >>> rgx = re.compile(“((GC){3,})”)  #这个模式中有2个分组,从左边往右边数,左边第一个括号就是第一个分组,左边第2个括号就是第2个分组。

    >>> result = rgx.search(seq)

    >>> result.groups()

    (’GCGCGCGC’, ’GC’)

    所有在模式中的两个组都被提取了(从左边到右边计数)。正是这样的方法因为该每个组是“捕获”的。如果你不需要内部的子组(如“GC”),你可以注释为“非捕获”。这就需要在组的开头用“?:”:

    >>> rgx = re.compile(“((?:GC){3,})”)

    >>> result = rgx.search(seq)

    >>> result.groups()

    (’GCGCGCGC’,)

    indall的行为也不同。没有组时,它返回一个匹配的字符串的列表。如果有一个组在模式中,它返回一个这个组的列表。如果有多个组在模式中,它返回一个元组的列表:

    >>> rgx = re.compile(“TAT”) # No group at all.

    >>> rgx.findall(seq) # This returns a list of matching strings.

    [’TAT’, ’TAT’]

    seq = “ATATAAGATGCGCGCGCTTATGCGCGCA”

    >>> rgx = re.compile(“(GC){3,}”) # One group. Return a list

    >>> rgx.findall(seq) # with the group for each match.

    [’GC’, ’GC’]                 ########返回group匹配的内容,(GC)在seq中的GCGCGCGC和GCGCGC都可以匹配到,但只返回(GC)匹配的结果,也就是GC

    >>> rgx = re.compile(“((GC){3,})”) # Two groups. Return a

    >>> rgx.findall(seq) # list with tuples for each match.

    [(’GCGCGCGC’, ’GC’), (’GCGCGC’, ’GC’)]    ########模式中2个group,在seq的GCGCGCGC分别返回(GC){3,}和(GC),在seq的GCGCGC分别返回                                                                                      (GC){3,}和(GC)

    >>> rgx = re.compile(“((?:GC){3,})”) # Using a non-capturing

    >>> rgx.findall(seq) # group to get only the matches.

    [’GCGCGCGC’, ’GCGCGC’]

    组还可以被标记以备后用。来给出一个组的名字用?P:<name>。代码9.2显示了怎样用这个特性:

    例9.2:

    import re
    rgx = re.compile("(?P<TBX>TATA..).*(?P<CGislands>(?:GC){3,})")
    seq = "ATATAAGATGCGCGCGCTTATGCGCGCA"
    result = rgx.search(seq)
    print(result.group('CGislands'))
    print(result.group('TBX'))

    这个程序返回:

    GCGCGC

    TATAGA

  • 相关阅读:
    vue初级 总结
    defineProperty和defineProperties介绍
    vue的生命周期
    将组件拼装使用
    Android和Html的简单交互
    Android接口回调的理解
    Android设计模式—— 观察者模式(以及EventBus的简单使用)
    Android Span的简单使用
    Android7.0打开sdacrd图片问题
    打开图片无缩略图错误
  • 原文地址:https://www.cnblogs.com/nklzj/p/6259246.html
Copyright © 2020-2023  润新知