Python 标准库模块 - re

如题所述

re模块被称为正则表达式,其作用为,创建一个“规则表达式”,用于验证和查找符合规则的文本,广泛用于各种搜索引擎、账户密码的验证等。

预定义字符:

\d:匹配所有的十进制数字0-9

\D:匹配所有的非数字,包含下划线

\s:匹配所有空白字符(空格、TAB等)

\S:匹配所有非空白字符,包含下划线

\w:匹配所有字母、汉字、数字a-z A-Z 0-9

\W:匹配所有非字母、汉字、数字,包含下划线

特殊字符:

$:匹配一行的结尾(必须放在正则表达式最后面)

^:匹配一行的开头(必须放在正则表达式最前面)

*:前面的字符可以出现0次或多次(0~无限)

+:前面的字符可以出现1次或多次(1~无限)

?:变"贪婪模式"为"勉强模式",前面的字符可以出现0次或1次

.:匹配除了换行符"\n"之外的任意单个字符

|:两项都进行匹配

[ ]:代表一个集合,有如下三种情况

[abc]:能匹配其中的单个字符

[a-z0-9]:能匹配指定范围的字符,可取反(在最前面加入^)

[2-9] [1-3]:能够做组合匹配

{ }:用于标记前面的字符出现的频率,有如下情况:

{n,m}:代表前面字符最少出现n次,最多出现m次

{n,}:代表前面字符最少出现n次,最多不受限制

{,m}:代表前面字符最多出现n次,最少不受

{n}:前面的字符必须出现n次

温馨提示:答案为网友推荐,仅供参考
第1个回答  2022-07-08

正则表达式引擎对正则表达式文本进行编译生成正则表达式对象,再由正则表达式对象对目标文本进行匹配,后返回匹配结果。

正则表达式中一共包含 2 中字符: 普通字符 、 元字符

匹配单个字符的元字符及其含义:

匹配重复性的元字符及其含义:

匹配位置的元字符及其含义:

分组匹配的元字符及其含义:

表示或运算的元字符:

转义元字符:

在 Python 中使用正则表达式,我们需要借助 re 模块提供的强大 API,下面我们就来学习几个 re 模块常用的接口吧~

参数说明: findall("正则表达式", "要匹配的字符串", flags=标志1|标志2|...)
返回值:以列表形式返回匹配到的字符串。

下面,我们用 findall 返回 Python 之禅中首尾用到的反义词:

运行结果:

当正则表达式中含有一个以上分组时, findall 返回的列表由元组构成,元组中包含每个分组匹配到的内容。如果只有一个分组,则返回由该分组匹配到的内容组所构成的列表:

match 函数返回的结果是一个 SRE_Match 对象:

SRE_Match 具有很多的属性,比如 .string 属性可以方便我们我获取在匹配时输入的字符串:

属性 .re 可以获取匹配时使用的编译后的正则表达式模式:

由于默认使用了 re.UNICODE ,所以我们这里的 \w 可以匹配中文字符。

属性 .regs 则以列表的形式返回正则表达式匹配到的内容以及各个分组陪陪到的内容,不过请注意,返回的都是索引的形式:

可以使用序列切片来看一下我们的正则表达式及其中的两个分组所匹配到的内容:

SRE_Match 对象也提供了非常多好用的方法,比如 groups 可以获取各个分组匹配到的内容:

group 则可以灵活地获取正则表达式或对应分组匹配到的内容:

如果使用的正则表达式定义了分组的名称, group 还可以通过名称获取相应分组匹配的内容:

在定义了分组的名称之后,还可以方便地使用 groupdict 以字典的形式返回所有分组匹配的结果:

最后需要注意的是, match 从字符串的开头开始匹配,如果开头不符合要求,则直接返回 None 。

与 match 匹配开头不同, search 匹配第一个符合规则的字符串,未成功则返回 None 。参数: re.search(pattern, string, flags=0) ;返回值同 match 。

在介绍 match 的使用时,最后一个例子,由于我们在字符串前面添加了 'PYTHON' 导致 match 使用原来的正则表达式无法匹配,返回 None 。此时,使用 search 就可以迎刃而解啦:

运行结果:

小结:

参数: re.split(pattern, string, maxsplit=0, flags=0) , split 功能非常强大,以正则表达式匹配到的标志来分隔字符串,比如下面这样一个混乱的字符串,我们要提取其中所有的数字:

下面,我们就来详细介绍一下 split 的用法。

首先,是以单字符切割:

以分号切割时,共产生了 4 个子字符串,放在列表中返回。
下面,还是以单字符切割,但可以使用正则表达式中的 [] 来指定多种字符:

由于字符串 line 中有连续的 2 个分号,逗号或者空格,因此可以使用 [;\s,]+ 来切割:

最后,上面的字符串在切割时,分隔符都没有被保留下来,使用括号捕获分组,即可保留分隔符:

re.sub 提供比字符串的 replace 方法更加强大的功能:对于输入的字符串 string ,利用正则表达式 pattern 强大的字符串处理功能,实现复杂的字符串替换处理为 repl ,返回被替换后的字符串。

下面的例子中,我们将句子中多余的空格和数字去掉:

如果想要知道替换过程中,共发生了多少次替换,可以使用 subn :

小结:

上述的案例中,我们每次都需要传入正则表达式,相应的函数每次在调用时,都需要编译一次正则表达式。如果上述过程需要多次重复,那么每次都去耗费时间编译正则表达式是很不划算的。

re 模块为我们提供了 compile 函数,用来编译正则表达式模式,返回编译好模式。因此,可以把那些常用的正则表达式编译成正则表达式对象,以提高效率。

格式: re.compile(pattern, flags=0) ,其中 pattern 为编译时用的表达式字符串, flags 为编译标志位,用于修改正则表达式的匹配方式,如:是否区分大小写,多行匹配等。常用的 flags 有:

注:使用按位或 | 连接多个 flags 。

我们上述介绍的 re 模块的匹配、分割、替换函数, compile 函数的返回值类提供了相应的方法,使用方式类似,只是不需要传入正则表达式字符串而已。

由于用法几乎一致,这里就不一一举例啦~

贪婪模式 : * + ? {m,n} ,正则表达式的重复默认总是尽可能多得向后匹配内容。

非贪婪模式 : *? +? ?? {m,n}? ,尽可能少的匹配内容。

相似回答