正则表达式之匹配模式

正则表达式(五)

  匹配模式

  匹配模式是指匹配时使用的规则。设定特定的模式,可能会改变对正则表达式的识别,也可能会改变正则表达式中的字符的匹配规定。常用匹配模式有:不区分大小写模式、单行模式、多行模式、注释模式。

  不区分大小写模式

  不区分大小写是指正则表达式在匹配文本字符串的时候,不区分文本字符串中的大小写问题。

  模式指定方式

    1.模式修饰符指定:模式修饰符(?i),例如:正则表达式(?i)the,表示匹配文本字符串中的不区分大小写the。

    2.预定义的常量作为特殊参数传入指定:python中使用常量re.I或者re.IGNORECASE;JS中使用/regex/i,其中re.I用法例:re.search(patten, string, re.I);JS中regex为匹配为本,如1中例子的the。

  提取超链接的正则表达式

(?i)<as+hrefs*=s*["']?([^"'s]+)["']?>([^<]+)</a>

  提取标题的正则表达式

(?i)<title>([^>]+)</title>

  提取图片的正则表达式

(?i)<imgs[^>]*?src=['"]?([^'"]+)[^'"]?[^>]*>

   单行模式

  单行模式下,所有文本只有一行。回到点号匹配任意字符问题,我们提到过,点号是不能匹配 换行符的,但是在单行模式下,所有文本一行显示,相应的 换行符也只是一个普通的空白符了,不具有换行效果的,因此,点号是可以匹配的。故,点号在单行模式下,是可以匹配任意字符的。

  单行模式影响的是点号的匹配规则:默认模式下,点号可以匹配 换行符以外的任意字符;单行模式下,点号可以匹配任意字符包括 换行符。

  模式指定方式

    1.模式修饰符指定:模式修饰符(?s),用法在正则表达式开头加上(?s)表示此正则表达式启动单行模式;

    2.预定义的常量作为特殊参数传入指定:python中使用常量re.S或者re.DOTALL;JS中不支持单行模式,其中re.S用法例:re.search(patten, string, re.S)。

  多行模式

  多行模式与单行模式没有必要的联系。多行模式影响的是^和$的匹配规则:默认模式下,^和$匹配的是整个字符串的起始位置和结束位置;多行模式下,^和$可以匹配字符串内部的起始位置和结束位置。

  默认模式下,“人生苦短 我用python”和多行模式下,“人生苦短 我用python”。首先明白一点,没有指定单行模式情况下, 换行符都是表示换行的,不再是普通的空白符。即

“人生苦短
我用python”

  默认模式下,^和$会分别匹配“人”之前位置和“n”之后位置;而多行模式下,^匹配的位置就变成了“人”之前的位置和“我”之前的位置,$匹配的位置变成了“短”之后的位置和“n”之后的位置。“$短”和“^我”都是匹配了字符串内部的起始位置和结束位置。

  模式指定方式

    1.模式修饰符指定:模式修饰符(?m),用法在正则表达式开头加上(?m)表示此正则表达式启动多行模式;

    2.预定义的常量作为特殊参数传入指定:python中使用常量re.M或者re.MULTILINE;JS中用/regex/m,其中re.M用法例:re.search(patten, string, re.M)。

  注释模式

  正则表达式一般添加注释的方法为(?#comment),可以在正则表达式的任意位置添加注释。注释模式添加注释是把正则表达式以多行字符串形式表示,在每行正则规则后面添加 #comment,表示注释。  

  模式指定方式

    1.模式修饰符指定:模式修饰符(?x),用法在正则表达式开头加上(?x)表示此正则表达式启动注释模式;

    2.预定义的常量作为特殊参数传入指定:python中使用常量re.X或者re.VERBOSE;JS中用/regex/x,其中re.S用法例:re.search(patten, string, re.X)。

pattern = r'''
(?x)  #enable multiline and extended mode
(
    (d{4})  #year
    -  #dash
    (d{2})  #month
    -
    (d{2})  #day
)
'''

  其他模式

  re.U或者re.UNICODE,字符组匹配字符可以是unicode字符,包括中文字符。

  re.A或者re.ASCII,字符组匹配字符是ASCII字符。

原文地址:https://www.cnblogs.com/snow-lanuage/p/10609040.html