Python正则表达式之编译正则表达式(3)

模块级别的函数

使用正则表达式也并非一定要创建模式对象,然后调用它的匹配方法。因为,re 模块同时还提供了一些全局函数,例如 match()search()findall()sub() 等等。这些函数的第一个参数是正则表达式字符串,其他参数跟模式对象同名的方法采用一样的参数;返回值也一样,同样是返回 None 或者匹配对象。

>>> print(re.match(r'From\s+', 'From_Fish.com'))
None
>>> re.match(r'From\s+', 'From Fish.com')
<_sre.SRE_Match object; span=(0, 5), match='From '>

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
其实,这些函数只是帮你自动创建一个模式对象,并调用相关的函数。它们还将编译好的模式对象存放在缓存中,以便将来可以快速地直接调用.

那我们到底是应该直接使用这些模块级别的函数呢,还是先编译一个模式对象再调用模式对象的方法呢?这其实取决于正则表达式的使用频率,如果说我们这个程序只是偶尔使用到正则表达式,那么全局函数是比较方便的;如果我们的程序是大量的使用正则表达式(例如在一个循环中使用),那么建议你使用后一种方法因为预编译的话可以节省一些函数调用。但如果是在循环外部,由于得益于内部缓存机制,两者效率相差无几。

编译标志

编译标志让你可以修改正则表达式的工作方式。在 re 模块下,编译标志均有两个名字:完整名简写,例如 IGNORECASE 简写是 I(例如 re.VERBOSE 的简写是 re.X)。另外,多个标志还可以同时使用(通过“|”),如:re.I | re.M 就是同时设置 IM 标志。

下边列举一些支持的编译标志:

标志含义
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] 也将会匹配对应的小写字母,像 Fish 可以匹配 fish 或 FISHC 等。如果你不设置 LOCALE,则不会考虑语言(区域)设置这方面的大小写问题。

L

LOCALE
使得 \w\W\b\B 依赖当前的语言(区域)环境,而不是 Unicode 数据库

区域设置是 C 语言的一个功能,主要作用是消除不同语言之间的差异。例如你正在处理的是法文文本,你想使用 \w+ 来匹配单词,但是 \w 只是匹配 [A-Za-z] 中的单词,并不会匹配 'é''&#231;'。如果你的系统正确的设置了法语区域环境,那么 C 语言的函数就会告诉程序 'é''&#231;' 也应该被认为是一个字符。当编译正则表达式的时候设置了 LOCALE 的标志,\w+ 就可以识别法文了,但速度多少会受到影响。

M

MULTILINE
通常 ^匹配字符串的开头,而 $匹配字符串的结尾。当这个标志被设置的时候,^ 不仅匹配字符串的开头,还匹配每一行的行首$ 不仅匹配字符串的结尾,还匹配每一行的行尾

X

VERBOSE
这个标志使你的正则表达式可以写得更好看和更有条理,因为使用了这个标志,空格会被忽略除了出现在字符类中和使用反斜杠转义的空格);这个标志同时允许你在正则表达式字符串中使用注释,# 符号后边的内容是注释,不会递交给匹配引擎(除了出现在字符类中和使用反斜杠转义的 #)。

下边是使用 re.VERBOSE 的例子,大家看下正则表达式的可读性是不是提高了不少:

charref = re.compile(r"""
 &[#]                # 开始数字引用
 (
     0[0-7]+         # 八进制格式
   | [0-9]+          # 十进制格式
   | x[0-9a-fA-F]+   # 十六进制格式
 )
 ;                   # 结尾分号
""", re.VERBOSE)

在这里插入图片描述

如果没有设置 VERBOSE 标志,那么同样的正则表达式会写成:

charref = re.compile("&#(0[0-7]+|[0-9]+|x[0-9a-fA-F]+);")

在这里插入图片描述

解释:

哪个可读性更佳?(因为在正则表达式的式子里面,如果没有开启VERBOSE,那么将不能随意添加空格,换行,TAB键;但是如果开启了VERBOSE(详细表达式模式),那么就可以随意加入添加空格,换行,TAB键,以及注释)

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻梦&之璐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值