模块级别的函数
使用正则表达式也并不是必定要建立模式对象,而后调用它的匹配方法。由于,re 模块同时还提供了一些全局函数,例如 match(),search(),findall(),sub() 等等。这些函数的第一个参数是正则表达式字符串,其余参数跟模式对象同名的方法采用同样的参数;返回值也同样,一样是返回 None 或者匹配对象。
正则表达式
其实,这些函数只是帮你自动建立一个模式对象,并调用相关的函数(上一篇的内容,还记得吗?)。它们还将编译好的模式对象存放在缓存中,以便未来能够快速地直接调用。
那咱们究竟是应该直接使用这些模块级别的函数呢,仍是先编译一个模式对象,再调用模式对象的方法呢?这其实取决于正则表达式的使用频率,若是说咱们这个程序只是偶尔使用到正则表达式,那么全局函数是比较方便的;若是咱们的程序是大量的使用正则表达式(例如在一个循环中使用),那么建议你使用后一种方法,由于预编译的话能够节省一些函数调用。但若是是在循环外部,因为得益于内部缓存机制,二者效率相差无几。
编译标志
编译标志让你能够修改正则表达式的工做方式。在 re 模块下,编译标志均有两个名字:完整名和简写,例如 IGNORECASE 简写是 I(若是你是 Perl 的粉丝,那么你有福了,由于这些简写跟 Perl 是同样的,例如 re.VERBOSE 的简写是 re.X)。另外,多个标志还能够同时使用(经过“|”),如:re.I | re.M 就是同时设置 I 和 M 标志。
下边列举一些支持的编译标志:
数据库
标志 | 含义 |
ASCII, A | 使得转义符号如 \w,\b,\s 和 \d 只能匹配 ASCII 字符 |
DOTALL, S | 使得 . 匹配任何符号,包括换行符 |
IGNORECASE, I | 匹配的时候不区分大小写 |
LOCALE, L | 支持当前的语言(区域)设置 |
MULTILINE, M | 多行匹配,影响 ^ 和 $ |
VERBOSE, X (for 'extended') | 启用详细的正则表达式 |
下面咱们来详细讲解一下它们的含义:
A
ASCII
使得 \w,\W,\b,\B,\s 和 \S 只匹配 ASCII 字符,而不匹配完整的 Unicode 字符。这个标志仅对 Unicode 模式有意义,并忽略字节模式。
S
DOTALL
使得 . 能够匹配任何字符,包括换行符。若是不使用这个标志,. 将匹配除了换行符的全部字符。
I
IGNORECASE
字符类和文本字符串在匹配的时候不区分大小写。举个例子,正则表达式 [A-Z] 也将会匹配对应的小写字母,像 FishC 能够匹配 FishC,fishc 或 FISHC 等。若是你不设置 LOCALE,则不会考虑语言(区域)设置这方面的大小写问题。
L
LOCALE
使得 \w,\W,\b 和 \B 依赖当前的语言(区域)环境,而不是 Unicode 数据库。
区域设置是 C 语言的一个功能,主要做用是消除不一样语言之间的差别。例如你正在处理的是法文文本,你想使用 \w+ 来匹配单词,可是 \w 只是匹配 [A-Za-z] 中的单词,并不会匹配 'é' 或 'ç'。若是你的系统正确的设置了法语区域环境,那么 C 语言的函数就会告诉程序 'é' 或 'ç' 也应该被认为是一个字符。当编译正则表达式的时候设置了 LOCALE 的标志,\w+ 就能够识别法文了,但速度多少会受到影响。
M
MULTILINE
(^ 和 $ 咱们尚未提到,别着急,后边咱们有细讲...)
一般 ^ 只匹配字符串的开头,而 $ 则匹配字符串的结尾。当这个标志被设置的时候,^ 不只匹配字符串的开头,还匹配每一行的行首;& 不只匹配字符串的结尾,还匹配每一行的行尾。
X
VERBOSE
这个标志使你的正则表达式能够写得更好看和更有条理,由于使用了这个标志,空格会被忽略(除了出如今字符类中和使用反斜杠转义的空格);这个标志同时容许你在正则表达式字符串中使用注释,# 符号后边的内容是注释,不会递交给匹配引擎(除了出如今字符类中和使用反斜杠转义的 #)。
下边是使用 re.VERBOSE 的例子,你们看下正则表达式的可读性是否是提升了很多:缓存
若是没有设置 VERBOSE 标志,那么一样的正则表达式会写成:函数
哪一个可读性更加?相信你们内心有底了。spa