2.1  一般形式


      表2-1  量词的一般形式

    量词

    说明

    {n}

    之前的元素必须出现n

    {m,n}

    之前的元素最少出现m次,最多出现n

    {m,}

    之前的元素最少出现m次,出现次数无上限

    {0,n}

    之前的元素可以不出现,也可以出现,最多出现n

    (在某些语言中可以写为{,n}

    2.2  常用量词

    表2-2  常用量词

    常用量词

    {m,n}等价形式

    说明

    *

    {0,}

    可能出现,也可能不出现,出现次数没有上限

    +

    {1,}

    至少出现1次,出现次数没有上限

    ?

    {0,1}

    至多出现1次,也可能不出现

     
     

    表2-3  各类tag的匹配

    匹配所有tag的表达式

    tag分类

    匹配分类tag的表达式

     

    <[^>]+>

    open tag

    <[^/>][^>]*>

    close tag

    </[^>]+>

    self-closing tag

    <[^>/]+/>

    注:这几个表达式不是很严谨,如匹配open tag的表达式,也可以匹配self-closing tag。作者说现有的知识还不足够解决这个问题而已,需要继续学习。
    2.3  数据提取
    In [1]: import re
    
    In [2]: re.search(r"\d{6}", "ab123456cd").group(0)
    Out[2]: '123456'
    
    In [3]: re.search(r"^<[^>]+>$", "<bold>").group(0)
    Out[3]: '<bold>'
    
    In [4]: re.findall(r"\d{6}", "zipcode1:201203, zipcode2:100859")
    Out[4]: ['201203', '100859']
    2.4  点号
     
    匹配除换行符外的所有字符
    2.5   滥用点号的问题
    因为点号能匹配几乎所有的字符,所以实际应用中许多人图省事,随意使用.*或.+,结果却事与愿违
    之前介绍的量词都可以归到一类,叫做匹配优先量词(greedy quantifier,也有人翻译为贪婪量词 )。
    匹配优先量词,顾名思义,就是在拿不准是否要匹配的时候,优先尝试匹配,并且记下这个状态,以备将来"反悔"。
    回溯(backtracking)
     
    re.search(r"\".*\"", "\"quoted string\" and another\"").group(0)
    re.search(r'".*"', '"quoted string" and another"').group(0)
    re.search(r"\"[^\"]*\"", "\"quoted string\" and another\"").group(0)
    re.search(r'"[^"]*"', '"quoted string" and another"').group(0
    2.6 忽略优先量词
    匹配优先量词与忽略优先量词逐一对应,只是在对应的匹配优先量词之后添加?,
    两者限定的元素能出现的次数也一样,遇到不能匹配的情况同样需要回溯;唯一的区别在于,
    忽略优先量词会优先选择"忽略",而匹配优先量词会优先选择"匹配"。

    表2-4  匹配优先量词与忽略优先量词

    匹配优先量词

    忽略优先量词

    限定次数

    *

    *?

    可能不出现,也可能出现,出现次数没有上限

    +

    +?

    至少出现1次,出现次数没有上限

    ?

    ??

    至多出现1次,也可能不出现

    {m,n}

    {m,n}?

    出现次数最少为m次,最多为n

    {m,}

    {m,}?

    出现次数最少为m次,没有上限

    {,n}

    {,n}?

    可能不出现,也可能出现,最多出现n

    2.7 转义

    量词

    转义形式

    {n}

    \{n}

    {m,n}

    \{m,n}

    {m,}

    \{m,}

    {,n}

    \{,n}

    *

    \*

    +

    \+

    ?

    \?

    *?

    \*\?

    +?

    \+\?

    ??

    \?\?