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']
目录
相关文章
|
5天前
|
Python
在Python中,可以使用内置的`re`模块来处理正则表达式
在Python中,可以使用内置的`re`模块来处理正则表达式
18 5
|
10天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
15天前
|
Java 程序员 开发者
Python的gc模块
Python的gc模块
|
18天前
|
数据采集 Web App开发 JavaScript
python-selenium模块详解!!!
Selenium 是一个强大的自动化测试工具,支持 Python 调用浏览器进行网页抓取。本文介绍了 Selenium 的安装、基本使用、元素定位、高级操作等内容。主要内容包括:发送请求、加载网页、元素定位、处理 Cookie、无头浏览器设置、页面等待、窗口和 iframe 切换等。通过示例代码帮助读者快速掌握 Selenium 的核心功能。
62 5
|
19天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy教程之SciPy模块列表13:单位类型。常量模块包含多种单位,如公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了如何使用`constants`模块获取零摄氏度对应的开尔文值(273.15)和华氏度与摄氏度的转换系数(0.5556)。
17 1
|
20天前
|
XML 前端开发 数据格式
超级详细的python中bs4模块详解
Beautiful Soup 是一个用于从网页中抓取数据的 Python 库,提供了简单易用的函数来处理导航、搜索和修改分析树。支持多种解析器,如 Python 标准库中的 HTML 解析器和更强大的 lxml 解析器。通过简单的代码即可实现复杂的数据抓取任务。本文介绍了 Beautiful Soup 的安装、基本使用、对象类型、文档树遍历和搜索方法,以及 CSS 选择器的使用。
51 1
|
17天前
|
Python
SciPy 教程 之 SciPy 模块列表 16
SciPy教程之SciPy模块列表16 - 单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例代码展示了力学单位的使用,如牛顿、磅力和千克力等。
15 0
|
18天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy 教程之 SciPy 模块列表 15 - 功率单位。常量模块包含多种单位,如公制、质量、时间等。功率单位中,1 瓦特定义为 1 焦耳/秒,表示每秒转换或耗散的能量速率。示例代码展示了如何使用 `constants` 模块获取马力值(745.6998715822701)。
15 0
|
18天前
|
JavaScript Python
SciPy 教程 之 SciPy 模块列表 15
SciPy教程之SciPy模块列表15:单位类型。常量模块包含多种单位,如公制、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。功率单位以瓦特(W)表示,1W=1J/s。示例代码展示了如何使用`constants`模块获取马力(hp)的值,结果为745.6998715822701。
16 0
|
19天前
|
Python
SciPy 教程 之 SciPy 模块列表 13
SciPy 教程之 SciPy 模块列表 13 - 单位类型。常量模块包含多种单位:公制、二进制(字节)、质量、角度、时间、长度、压强、体积、速度、温度、能量、功率和力学单位。示例:`constants.zero_Celsius` 返回 273.15 开尔文,`constants.degree_Fahrenheit` 返回 0.5555555555555556。
13 0