Python 正则表达式 re模块 最全面超详细总结(上)

简介: Python 正则表达式 re模块 最全面超详细总结(上)

   想必字符串大家肯定都知道吧?在 Python 里我们常常需要对字符串进行操作,而在字符串对象本身就有许多内置的方法,大多数只需要对字符串简单处理的情况下,这些方法就已经足够了,比如 split 、 join 、 strip 、 lstrip 、 rstrip 和 replace 等等。然鹅,这些都只是对字符串处理的普通操作,真正强大的高级操作是 正则表达式 !又正好,Python有一个内置的正则表达式模块,它就是  re 模块 !

【个人建议:想要灵活掌握re模块,建议在稍稍了解正则表达式语法的基础上(不必完全记住,因为一开始不好理解),再学习 re 模块的函数及类。在看re模块的代码示例时遇到不懂的语法规则,可以再回头看看正则表达式的语法,这样方便理解和掌握】

正则表达式

       正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。

匹配模式(pattern)—— 元字符

【注:下面的 RE(Regular Expression) 表示某个具体的正则表达式】 image.pngimage.png

可选标志(flags)—— 修饰符

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志,可有可无,多个标志可以通过按位或的符号(“|”) 来指定(如:re.M|re.X )。修饰符本身只是一个大写字母而已,但我们在Python里平时引入re模块时习惯用 import re,所以下面的修饰符在用的时候记得在其前面加上 re. 哦!

image.png

re模块

   Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数

re模块的类

【error类】

error(msg: str, pattern: str | bytes | None = ..., pos: int | None = ...)

re 模块所有异常的公共基类,一般用不到

【Match类】

匹配类,相当于匹配结果

【方法 group】无参数时返回匹配的字符串,若有参数,返回名为参数的分组的字符串


【方法 groups】无参数,返回一个包含所有分组字符串的元组


【方法 groupdict】无参数,类似于方法 groups,但返回一个字典


【方法 start】用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0


【方法 end】用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0


【方法 span】返回匹配开始与结束位置索引的元组(start(group), end(group)),参数为 group,用法类似于上面


【方法 expand】有一个 template 参数,接收字符串类型,返回一个字符串【具体啥用我也不清楚】

【Pattern类】

匹配模式类,相当于匹配规则,Pattern 类拥有很多类似于后面要讲到的函数的方法,但与下面的函数相比,它们又有区别

方法 findall

findall(string: str, pos: int = ..., endpos: int = ...)

与 findall 函数相比,findall 方法没有 pattern 参数和 flags 参数(这俩参数由 compile 函数指定),pos 参数指定字符串的起始位置,默认为 0,endpos 参数指定字符串的结束位置,默认为字符串的长度,返回值一样,是个列表

方法 finditer

finditer(string: str, pos: int = ..., endpos: int = ...)

参数描述与上面的 findall 方法类似,返回值和 finditer 函数的一样

方法 fullmatch

fullmatch(string: str, pos: int = ..., endpos: int = ...)

参数描述与上面的 findall 方法类似,返回值和 fullmatch 函数的一样

方法 match

match(string: str, pos: int = ..., endpos: int = ...)

参数描述与上面的 findall 方法类似,返回值和 match 函数的一样

方法 search

search(string: str, pos: int = ..., endpos: int = ...)

参数描述与上面的 findall 方法类似,返回值和 search 函数的一样

方法 split

split(string: str, maxsplit: int = ...)

没有 pattern 参数和 flags 参数,其余参数与返回值和 split 函数的一样

方法 sub

sub(repl: str | (Match[str]), string: str, count: int = ...)

没有 pattern 参数和 flags 参数,其余参数与返回值和 sub 函数的一样

方法 sub

sub(repl: str | (Match[str]), string: str, count: int = ...)

没有 pattern 参数和 flags 参数,其余参数与返回值和 sub 函数的一样

【RegexFlag类】

正则表达式修饰符类,可选标志参数,包括 A(ASCII)、I(IGNORECASE)、L(LOCALE)、M(MULTILINE)、S(DOTALL)、U(UNICODE)、X(VERBOSE)、T(TEMPLAT)和 DEBUG 等

re模块的函数

【compile函数】

函数语法

compile(pattern: AnyStr@compile, flags: _FlagsType = ...)

【参数 pattern】一个正则表达式字符串

【参数 flags】可选标志,修饰符,默认不进行修饰

编译正则表达式函数,将正则表达式字符串编译为 Pattern 对象(Pattern[AnyStr@compile]),方便使用该正则表达式

代码示例

import re
#正则表达式含义:匹配单个非数字的字符
pattern_1 = re.compile(r'[^\d]')
#正则表达式含义:匹配单个数字字符或者单个小写字母字符
pattern_2 = re.compile(r'[0-9a-z]')
print(pattern_1.match('abc123').group())
#输出:a
print(pattern_2.search('ABCdef123').group())
#输出:d
print(pattern_1)
#输出:re.compile('[^\\d]')

【escape函数】

函数语法

escape(pattern: AnyStr@escape)

【参数 pattern】一个正则表达式字符串

函数对字符串中的转义字符进行还原,返回还原后的字符串

代码示例

import re
'''
此处不可直接用print输出,print会将还原后的字符又转义过去
用__repr__方法转换为原本的字符串后输出
不了解字符串类__repr__方法的应先去了解一下
'''
print(re.escape('Python.png').__repr__())
#输出:'Python\\.png'
print(re.escape('Python\Good').__repr__())
#输出:'Python\\\\png'
print(r'Python\Good'.__repr__())#见后面【转义与还原】部分了解更多
#输出:'Python\\Good'

【findall函数】

函数语法

findall(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)

【参数 pattern】正则表达式字符串或者Pattern类


【参数 string】要匹配的字符串


【参数 flags】可选标志,修饰符,默认不进行修饰


在 string 中寻找所有满足正则表达式的匹配结果,并将它们以列表形式返回,若没有满足条件的匹配结果,则返回空列表


代码示例

import re
#正则表达式含义:匹配两个连续的数字字符
outlist = re.findall('\d{2}','a12b34c56def780')
print(outlist)
#输出:['12', '34', '56', '78']

【finditer函数】

函数语法

finditer(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)

【参数 pattern】正则表达式字符串或者Pattern类


【参数 string】要匹配的字符串


【参数 flags】可选标志,修饰符,默认不进行修饰


和 findall 函数(见上)类似,唯一的区别是 finditer 函数返回的不是列表,而是一个迭代器(Iterator[Match[str]])


代码示例

import re
#正则表达式含义:匹配两个连续的数字字符
outiter = re.finditer('\d{2}','a12b34c56def780')
for i in outiter:
    print(i.group())
'''
输出:
12
34
56
78
'''

【fullmatch函数】

函数语法

fullmatch(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)

【参数 pattern】正则表达式字符串或者Pattern类


【参数 string】要匹配的字符串


【参数 flags】可选标志,修饰符,默认不进行修饰


与 match 函数类似,但它是完全匹配,即string必须从头到尾都满足 pattern 的模式,若满足则返回匹配结果(Match[str] 对象),否则返回 None

代码示例

import re
#正则表达式含义:匹配六个连续的非数字字符
Match_Object_1 = re.fullmatch('\D{6}','Python')
#正则表达式含义:匹配六个连续的单词字符
Match_Object_2 = re.fullmatch('\w{6}','JavaScript')
print(Match_Object_1.group())
#输出:Python
print(Match_Object_2.group())#没有完全匹配
#输出:AttributeError: 'NoneType' object has no attribute 'group'

【match函数】

函数语法

match(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)

【参数 pattern】正则表达式字符串或者Pattern类


【参数 string】要匹配的字符串


【参数 flags】可选标志,修饰符,默认不进行修饰


函数直接对 string 的开头进行匹配,匹配成功就返回匹配结果(Match[str] 对象),否则返回 None

代码示例

import re
#正则表达式含义:匹配六个连续的非数字字符
Match_Object_1 = re.match('\D{6}','Python')
#正则表达式含义:匹配六个连续的单词字符
Match_Object_2 = re.match('\w{6}','JavaScript')
print(Match_Object_1.group())
#输出:Python
print(Match_Object_2.group())
#输出:JavaSc

【purge函数】

函数语法

purge()

没有参数

清除正则表达式缓存,re 模块函数会对已编译的正则表达式对象进行缓存,在不同的 Python 版本中,缓存中已编译过的正则表达式对象的数目可能不同,而且没有文档记录,而 purge 函数能够用于清除这些缓代码示例

1. import re
2. 
3. #清除缓存
4. re.purge()#具体啥效果我也不太清楚...

【search函数】

函数语法

search(pattern: str | Pattern[str], string: str, flags: _FlagsType = ...)

【参数 pattern】正则表达式字符串或者Pattern类


【参数 string】要匹配的字符串


【参数 flags】可选标志,修饰符,默认不进行修饰


函数会从起始字符搜索整个 string,返回第一个满足正则表达式的匹配结果(Match[str] 对象),否则返回 None

代码示例

import re
#正则表达式含义:匹配3个连续的小写字母字符
#修饰符:I(IGNORECASE)忽略大小写,对大小写一视同仁
Match_Object_1 = re.search('[a-z]{3}','123_Oh_My_God_456',re.I)
#正则表达式含义:匹配字符串模式:_零个或多个连续单词字符_
Match_Object_2 = re.search('_\w*_','I_love_Python!')
print(Match_Object_1.group())
#输出:God
print(Match_Object_2.group())
#输出:_love_

【split函数】

函数语法

split(pattern: str | Pattern[str], string: str, maxsplit: int = ..., flags: _FlagsType = ...)

【参数 pattern】正则表达式字符串或者Pattern类


【参数 string】要匹配的字符串


【参数 maxsplit】最大分割次数,从左往右计数,默认为对象ellipsis,即完全分割


【参数 flags】可选标志,修饰符,默认不进行修饰


与字符串的 split 方法类似,返回分割后的字符串,但分割规则由正则表达式决定,不了解字符串对象 split 方法的应先去了解该方法

代码示例

import re
#正则表达式含义:匹配任意个连续的数字字符
#最大分割次数为3(切4刀,产生5份)
outlist_1 = re.split('\d*','a1b22c333d4444e',4)
#正则表达式含义:匹配一个或多个连续的数字字符
#最大分割次数为3(切3刀,产生4份)
outlist_2 = re.split('\d+','a1b22c333d4444e',3)
print(outlist_1)
#输出:['', 'a', '', 'b', 'c333d4444e']
print(outlist_2)
#输出:['a', 'b', 'c', 'd4444e']
目录
相关文章
|
11天前
|
安全 大数据 程序员
Python operator模块的methodcaller:一行代码搞定对象方法调用的黑科技
`operator.methodcaller`是Python中处理对象方法调用的高效工具,替代冗长Lambda,提升代码可读性与性能。适用于数据过滤、排序、转换等场景,支持参数传递与链式调用,是函数式编程的隐藏利器。
52 4
|
6月前
|
数据采集 监控 数据安全/隐私保护
Python正则表达式:用"模式密码"解锁复杂字符串
正则表达式是处理字符串的强大工具,本文以Python的`re`模块为核心,详细解析其原理与应用。从基础语法如字符类、量词到进阶技巧如贪婪匹配与预定义字符集,结合日志分析、数据清洗及网络爬虫等实战场景,展示正则表达式的强大功能。同时探讨性能优化策略(如预编译)和常见错误解决方案,帮助开发者高效掌握这一“瑞士军刀”。最后提醒,合理使用正则表达式,避免过度复杂化,追求简洁优雅的代码风格。
152 0
|
2月前
|
存储 安全 数据处理
Python 内置模块 collections 详解
`collections` 是 Python 内置模块,提供多种高效数据类型,如 `namedtuple`、`deque`、`Counter` 等,帮助开发者优化数据处理流程,提升代码可读性与性能,适用于复杂数据结构管理与高效操作场景。
103 0
|
11月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
318 62
|
3月前
|
数据安全/隐私保护 Python
抖音私信脚本app,协议私信群发工具,抖音python私信模块
这个实现包含三个主要模块:抖音私信核心功能类、辅助工具类和主程序入口。核心功能包括登录
|
6月前
|
Python
Python教程:os 与 sys 模块详细用法
os 模块用于与操作系统交互,主要涉及夹操作、路径操作和其他操作。例如,`os.rename()` 重命名文件,`os.mkdir()` 创建文件夹,`os.path.abspath()` 获取文件绝对路径等。sys 模块则用于与 Python 解释器交互,常用功能如 `sys.path` 查看模块搜索路径,`sys.platform` 检测操作系统等。这些模块提供了丰富的工具,便于开发中处理系统和文件相关任务。
237 14
|
10月前
|
Python
Python Internet 模块
Python Internet 模块。
210 74
|
7月前
|
人工智能 自然语言处理 Shell
[oeasy]python070_如何导入模块_导入模块的作用_hello_dunder_双下划线
本文介绍了如何在Python中导入模块及其作用,重点讲解了`__hello__`模块的导入与使用。通过`import`命令可以将外部模块引入当前环境,增强代码功能。例如,导入`__hello__`模块后可输出“Hello world!”。此外,还演示了如何使用`help()`和`dir()`函数查询模块信息,并展示了导入多个模块的方法。最后,通过一个实例,介绍了如何利用`jieba`、`WordCloud`和`matplotlib`模块生成词云图。总结来说,模块是封装好的功能部件,能够简化编程任务并提高效率。未来将探讨如何创建自定义模块。
85 8
|
7月前
|
缓存 Shell 开发工具
[oeasy]python071_我可以自己做一个模块吗_自定义模块_引入模块_import_diy
本文介绍了 Python 中模块的导入与自定义模块的创建。首先,我们回忆了模块的概念,即封装好功能的部件,并通过导入 `__hello__` 模块实现了输出 "hello world!" 的功能。接着,尝试创建并编辑自己的模块 `my_file.py`,引入 `time` 模块以获取当前时间,并在其中添加自定义输出。
102 5
|
11月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
269 63

推荐镜像

更多