正则表达式(五)
匹配模式
匹配模式是指匹配时使用的规则。设定特定的模式,可能会改变对正则表达式的识别,也可能会改变正则表达式中的字符的匹配规定。常用匹配模式有:不区分大小写模式、单行模式、多行模式、注释模式。
不区分大小写模式
不区分大小写是指正则表达式在匹配文本字符串的时候,不区分文本字符串中的大小写问题。
模式指定方式
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字符。