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']
目录
相关文章
|
28天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
45 4
|
8天前
|
Python
Python Internet 模块
Python Internet 模块。
102 74
|
25天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
104 63
|
27天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
27天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
1月前
|
JSON Linux 数据格式
Python模块:从入门到精通,只需一篇文章!
Python中的模块是将相关代码组织在一起的单元,便于重用和维护。模块可以是Python文件或C/C++扩展,Python标准库中包含大量模块,如os、sys、time等,用于执行各种任务。定义模块只需创建.py文件并编写代码,导入模块使用import语句。此外,Python还支持自定义模块和包,以及虚拟环境来管理项目依赖。
Python模块:从入门到精通,只需一篇文章!
|
28天前
|
Python
Python的模块和包
总之,模块和包是 Python 编程中非常重要的概念,掌握它们可以帮助我们更好地组织和管理代码,提高开发效率和代码质量
38 5
|
27天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
1月前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
47 5
|
1月前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。