在Python的正则表达式中,内联标记是一种在正则表达式中指定标志的方式,它可以在表达式本身中指定标志,而不是作为参数传递给re模块的函数。
内联标记在正则表达式模式的开头或结束处使用语法 (?...)
,其中 ...
是一个或多个标记字符。
下面是一些常用的内联标记及其用法:
(?i)
: 忽略大小写匹配。例如,(?i)hello
将会匹配 "hello"、"Hello" 和 "HELLO"。
(?m)
: 多行模式,使 ^
和 $
分别匹配每一行的开头和结尾。例如,(?m)^hello
将会匹配以 "hello" 开头的每一行。
(?s)
: 单行模式,使 .
匹配包括换行符在内的任意字符。例如,(?s)hello.world
将会匹配 "hello world"。
(?x)
: 启用详细模式,可以在正则表达式中使用空格和注释。这样可以增加正则表达式的可读性。例如,(?x)hello\sworld
将会匹配 "hello world"。
(?u)
: 使用 Unicode 匹配。通常情况下,默认情况下正则表达式是使用Unicode 进行匹配的,但使用 (?a)
可以启用 ASCII 模式。
(?a)
: 使用 ASCII 匹配
在Python中,默认情况下正则表达式是使用Unicode进行匹配的。这意味着正则表达式中的字符类(如\w
、\d
、\s
等)将与Unicode字符集匹配,而不仅仅是ASCII字符集。此默认行为可以通过使用内联标记来改变。
如果需要使用ASCII进行匹配,可以在正则表达式的开头加上(?a)
或者使用re.ASCII标志。
这样,正则表达式将只匹配ASCII字符。
例如,(?a)hello
或者re.compile('hello', re.ASCII)
将只匹配ASCII字符中的"hello"。
需要注意的是,ASCII模式下,\w
、\d
、\s
等字符类只匹配ASCII字符的对应类别,而不包括Unicode字符。
这些内联标记可以单独使用,也可以组合使用。例如,(?im)hello
可以同时启用忽略大小写和多行模式。
需要注意的是,内联标记只适用于当前的正则表达式,不会影响全局的 re 模块设置。
前面提到了re.IGNORECASE模式,忽略大小写。但是只想在某个地方使用忽略,而不在其他地方忽略呢?就可以用到内联标记。
用法示例:(?i:正则表达式)
看到这里,你应该已经理解了,内联标记实际就是匹配模式的部分范围生效。
① re.IGNORECASE 与 (?i:) 忽略大小写
② re.MULTILINE 与 (?m:) '^'和'$'的跨行限制开头结尾。
③ re.DOTALL 与 (?s:) 让 '.' 支持换行符的匹配。
④ re.VERBOSE 与 (?x:) 支持注释
⑤ re.ASCII 与 (?a:) 让 \w, \W, \b, \B, \d, \D, \s 和 \S 只匹配ASCII
补充说明:
多种标记方式:(?im: ) , im 可以换成任何你想要加的属性,只要不冲突就行。
比如:(?is:正则表达式)
排除标记方式:
比如flasg属性中,已经指定了忽略大小写,但是在某个地方一定不能忽略大小写,那么我们就可以设置排除标记方式。
(?-im: ) im 可以换成任何你想要加的属性。? 后面的 - 就是排除flasg属性的意思。
另外,还支持这种方式:(?ms-i:正则表达式 )