模式修正符也属于非捕获组,他们之间可以组合搭配,起到限定一些方式作用,使用匹配更精准。
模式修符如下表:
模式修正符 | 说 明 |
i | 表示在和模式进行匹配时不区分大小写 |
g | 表示全局匹配 |
m | 多行匹配,使用^和$时起作用,表示任何一行都可以和正则表达式开始或结束,但只匹配第一个,加g匹配所有多行 |
s | 表示元字符中的"."可以和\n(换行符号)匹配,默认是不能换行符号匹配。 |
x | 表示模式中的忽略空格符 |
e | 配合函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行。 |
A | 强制从目标字符串开头匹配,相当于元字符^。 |
Z | 强制以目标字符串结尾匹配,相当于元字符$。 |
D | 模式中$仅匹配目标字符串结尾,不可与换行符\n匹配,无它可以匹配换行符结尾的字符串。 |
U | 只匹配最近的一个字符串;不重复匹配。 |
下面分别举例说明:
1:i 不区分大小与,如re.findall('abc','abc Abc ABc ABC aBc aBC abC AbC',re.I) 全部匹配。
2:m 可以匹配多行字符,即字符串中包括换行也可以,如: 字符串 ”bacd\nabde\nabgh",匹配规则:/ab/ ,没有匹配字符串,规则:/ab/m 可以匹配到第二行,第三行其实也是相符的,但单加上m只匹配到第一条,在python中使用re.findall就匹配全部,这个参数在此函数中不起作用。
3:g 全局匹配,上面规则改成:/ab/mg 就会匹配所有符合条件的字符,无论多少行,上面例子可以匹配后两行,python无些参数,本身就是全局搜索。
4:S 可以匹配换行符。如: 字符串 ”bacd\nabde\nabgh",re.findall('cd.',s),没有匹配字符串,改成:re.findall('cd.',s,re.S),就可以匹配'cd\n',也就是加了这个修正符,可以将\n视为一个换行符号,否则将视为普通字符。
5:X,忽略模式中空格,如: 字符串 ”bacd\nabde\nabgh",re.findall(' c d',s),没有匹配的字符串,改成:re.findall(' c d',s,re.X),就和'cd\n'中的cd匹配成功。
6:A 强制从头开始匹配。如: 字符串 ”bacdefg", /ac/gi能匹不个字符,因为不是ac开头的,python中的re.A参数表示的是ascii码,在python中本身就是从头搜索的,所以无些参数。
7:Z 强制结尾匹配,/ab/Z,只能匹配字符串“efgab",而不能匹配"abcdef"因为不是以ab结尾的,python中fqhx无此参数。
8:D 不可匹配结尾的换行符。/ef$/D不能匹配"abcdef\n",而只能匹配"abcdef",去除/D修正符,可以匹配两个字符串。
9:U 只匹配最近一个字符串,也就是第一次出现的,python中的re.search()本身就是搜索到第一次的,在python中re.U是指指定的目标串是Unicode字符串。