导图社区 Python - 正则表达式re模块
re模块(正则表达式),是Python中常用的模块,导图介绍了正则表达式、正则表达式的使用、正则表达式的编写规则,适用于精确匹配特定的字符串!
编辑于2022-04-03 18:11:57掌握Pandas核心技巧,轻松玩转数据分析! 本篇思维导图系统梳理Pandas数据操作体系:按照数据流程:左分支从数据预览→清洗转换→数据处理→数据选择,右分支对数据应用,从数据拼接→分组聚合→描述统计→时序分析,涵盖选择技巧(标签/位置筛选)、分组聚合操作,以及时间序列处理(重采样、窗口计算)详解数学运算和统计方法(相关性分析、极值分析),助你快速构建数据分析工作流。
当运行程序时,数据会以变量、序列或者对象的形式,在程序中临时存储。但当程序运行结束之后,数据也随之消失。如果我们想长期保存数据,那么就需要将数据存储到磁盘文件中,这就需要通过Python读写文件,即I/O操作。I/O操作有三步:1、打开文件;2、文件读写;3、关闭文件(或者编写成with语句)。 本篇思维导图,即是围绕而操作的核心——文件对象(file_obj)来展开讲解,分为2个部分:一、file_obj的创建(open函数);二、file_obj的方法调用(读取文件、写入文件、文件指针以及最后的关闭文件)。 希望通过本篇思维导图,能帮助你对使用Python进行文件读写有更深的理解与认识!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的数字(包含整型、浮点型、复数)。 数字本身的内容不多,重点在其有多样的表现形式。然后,对数字的相关处理方式(运算 函数)。 值得注意的是,整型就是整数,但是,浮点型不等于小数,也表达不了分数。所有针对于小数及分数的运算,补充了Decimal类、Praction类的讲解部分。 最后,对于数字运算有重要关系的math模块,将相关的函数及特殊值进行汇总,希望对大家在用到数学运算的时侯带来帮助。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
社区模板帮助中心,点此进入>>
掌握Pandas核心技巧,轻松玩转数据分析! 本篇思维导图系统梳理Pandas数据操作体系:按照数据流程:左分支从数据预览→清洗转换→数据处理→数据选择,右分支对数据应用,从数据拼接→分组聚合→描述统计→时序分析,涵盖选择技巧(标签/位置筛选)、分组聚合操作,以及时间序列处理(重采样、窗口计算)详解数学运算和统计方法(相关性分析、极值分析),助你快速构建数据分析工作流。
当运行程序时,数据会以变量、序列或者对象的形式,在程序中临时存储。但当程序运行结束之后,数据也随之消失。如果我们想长期保存数据,那么就需要将数据存储到磁盘文件中,这就需要通过Python读写文件,即I/O操作。I/O操作有三步:1、打开文件;2、文件读写;3、关闭文件(或者编写成with语句)。 本篇思维导图,即是围绕而操作的核心——文件对象(file_obj)来展开讲解,分为2个部分:一、file_obj的创建(open函数);二、file_obj的方法调用(读取文件、写入文件、文件指针以及最后的关闭文件)。 希望通过本篇思维导图,能帮助你对使用Python进行文件读写有更深的理解与认识!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的数字(包含整型、浮点型、复数)。 数字本身的内容不多,重点在其有多样的表现形式。然后,对数字的相关处理方式(运算 函数)。 值得注意的是,整型就是整数,但是,浮点型不等于小数,也表达不了分数。所有针对于小数及分数的运算,补充了Decimal类、Praction类的讲解部分。 最后,对于数字运算有重要关系的math模块,将相关的函数及特殊值进行汇总,希望对大家在用到数学运算的时侯带来帮助。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
正则表达式 re模块
1. 正则表达式
由普通字符和一些元字符组成的逻辑表达式
正则表达式的组成
普通字符
包含数字、大小写字母
元字符
用字符或字符的组合表达特殊的含义
正则表达式的作用
用于精确匹配特定模式的字符串,进而更好的完成字符串操作(查找、替换、分割)
在字符串前加 r ,去转义
当需要匹配真实的某些字符时,需要使用转义字符(加 \ )
如,匹配真实的_
括号
\(\)
星号
\*
问号
\?
加号
\+
2. 正则表达式的使用
一、 re模块
查找
re.match()
从给定文本开头的位置,开始匹配
语法格式
res = re.match(pattern,string,flags=0)
尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。匹配成功re.match方法返回一个匹配的对象。
匹配成功
返回一个Match对象
匹配不成功
返回None
参数
pattern
匹配的正则表达式
string
要匹配的字符串
len(string) >= len(pattern)
flags
标记,用于指定正则表达式的匹配方式
如:是否区分大小写,多行匹配等等。
re.I 忽略大小写
re.M 支持多行
re.S 使用点(.)做任意匹配,包括换行符在内的任意字符(. 不包括换行符)
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境(进行本地化识别匹配)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S,根据Unicode 字符集解析字符
re.X 支持更灵活、更详细的模式,比如多行、忽略空白、加入注释等
适用于编写复杂的正则表达式
使用三引号''',创建一个多行字符串,并用#添加注释
同时设置多个标记
在多个标记之间,用 | 连接,如 re.M|re.I
re.search()
在整个给定的字符串中进行查找
语法格式
res = re.search(pattern,string,flags=0)
匹配成功
返回(查找到的第1个)一个Match对象
匹配不成功
返回None
参数
pattern、string、flags
re.findall()
在给定的字符串中,查找正则表达式所匹配的所有子字符串
语法格式
res = re.findall(pattern,string,flags=0)
在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意: match 和 search 是匹配一次 findall 匹配所有。
匹配成功
以列表(子字符串的集合)的形式返回
匹配不成功
返回空列表
参数
pattern
匹配的正则表达式
string
要匹配的字符串
len(string) >= len(pattern)
flags
标记,用于指定正则表达式的匹配方式
如:是否区分大小写,多行匹配等等。
re.I 忽略大小写
re.M 支持多行
re.S 使用点(.)做任意匹配,包括换行符在内的任意字符(. 不包括换行符)
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境(进行本地化识别匹配)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S,根据Unicode 字符集解析字符
re.X 支持更灵活、更详细的模式,比如多行、忽略空白、加入注释等
同时设置多个标记
在多个标记之间,用 | 连接,如 re.M|re.I
re.finditer()
在给定的字符串中,查找正则表达式匹配的所有子字符串
语法格式
re.finditer(pattern,string,flags=0)
和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。
匹配结果
以迭代器(Match对象的集合)的形式返回
参数
pattern、string、flags
替换
re.sub()
在查找的基础上,用给定的对象替换匹配的对象
语法格式
re.sub(pattern, repl, string, count=0, flags=0)
sub是substitute的所写,表示替换,将匹配到的数据进⾏替换。
返回值,new_string(替换后的字符串)
参数
必选参数
pattern
进行匹配的正则表达式
repl
用作替换的字符串,可以是一个函数
string
给定的原始字符串
可选参数
count
进行替换的最大次数,默认0(表示全部替换)
flag
指定正则表达式匹配方式的标记
re.subn()
在查找的基础上,用给定的对象替换匹配的对象
语法格式
re.subn(pattern, repl, string[, count])
行为与sub()相同,但是返回一个元组 (字符串, 替换次数)。
返回值,元组(sub(repl, string[, count]), 替换次数)
参数
同re.sub()
分割
re.split()
将能匹配到的子字符串作为分隔符分割原始字符串
语法格式
re.split(pattern, string, maxsplit=0, flags=0)
根据匹配进⾏切割字符串,并返回⼀个列表。
返回值
分割后的结果以列表形式返回
参数
maxsplit
pattern、string、flags
最大分割次数,默认0(表示不限次数)
二、 Match对象
Match对象的属性
Match对象的属性提供了很多与匹配有关的信息
string
原始字符串
re
正则表达式
pos
开始搜索位置的索引
endpos
结束搜索位置的索引
lastindex
最后一个捕获分组的索引
lastgroup
最后一个捕获分组的别名
Match对象的方法
可以获取匹配对象中各分组的详细信息
res.group([group1,group2,…])
用于获取一个或多个分组匹配的字符串
group() 同group(0)就是匹配正则表达式整体结果
group(1) 列出第一个括号匹配部分
group(2) 列出第二个括号匹配部分
group(3) 列出第三个括号匹配部分
res.groups([default])
以元组的形式返回全部分组捕获的字符串
default表示没有捕获到字符串的分组以这个值替代,默认None
res.groupdict([default])
返回一个字典,以有别名的分组的别名为键,以该分组捕获的字符串为值
没有别名的分组不包含在内
default同上
res.start([group])
返回指定的分组捕获的子字符串在string中的起始位置索引号,group默认0
res.end([group])
返回指定的分组捕获的子字符串在string中的中支位置索引号(子串最后一个字符的索引+1),group默认值为0
res.span([group])
返回(start(group),end(group))
res.expand(template)
将匹配到的分组带入template中,然后返回
template中,可以使用\i或\g<id>、\g<name>引用分组,但不能使用编号0
三、 Pattern对象
编译好的正则表达式对象
Pattern对象的创建
将正则表达式的字符串形式,编译为一个 Pattern 对象
re.compile()
语法格式
re.compile(pattern[,flags])
参数
pattern
正则表达式的字符串形式
flags
指定的正则表达式匹配方式的标记
Pattern对象的属性
pattern属性
正则表达式字符串
flags属性
匹配方式,用数字表示
groups属性
正则表达式中分组的个数
groupindex属性
以正则表达式中有别名的分组的别名为键,以该分组的编号为值的字典,没有别名的分组不包含在内
Pattern对象的方法
res.match(string[,pos[,endpos]])
res.search(string[,pos[,endpos]])
res.findall(string[,pos[,endpos]])
res.finditer(string(,pos[,endpos]))
查找
res.sub(repl,string[,count])
res.subn(repl,string[,count])
替换
res.split(string[,maxsplit])
分割
3. 正则表达式的编写规则
1||| 元字符
正则表达式具有特殊含义的字符
元字符
通配符
.
匹配任意1个字符(除了\n)
常用字符
\w
匹配字母、数字、下划线或汉字的字符,即 a-z、A-Z、0-9、_
\d
匹配数字,0~9
\s
匹配空白,即空格,tab键
\b
匹配单词的开始或结束位置的字符
\n
匹配一个换行符
\r
匹配一个回车符
\t
匹配一个制表符
匹配位置
^
插入符号
匹配字符串的开始位置的字符
$
美元符号
匹配字符串的结束位置的字符
反义元字符
\W
匹配除字母、数字、下划线或汉字的字符,即 非 a-z、A-Z、0-9、_
\D
匹配非数字,除0~9以外的任何字符
\S
匹配非空白字符
\B
匹配不是单词开始或结束位置的字符
[^x]
匹配除x以外的任意字符
[^aeiou]
匹配除aeiou这几个字母以外的任意字符
2||| 重复
*
重复,0次~无限次
+
重复,1次~无限次
?
重复,0次~1次
{m}
重复,m次
{m,}
重复,m次及m次以上
{m,n}
重复,m次 ~ n次
在进行查找或替换时,需要连续查找或替换多个某种类型的字符
3||| 字符类
匹配字符集中任意一个字符
[...] 字符集的编写规则
逐个列出
[abc]
查找的字符,是方括号内字符中的一个
[^abc]
^(取反),查找的字符不是方括号内的字符
给出范围
[a-c]
查找的字符,是a~c中的一个
[^a-c]
^(取反),查找的字符不是a~c的一个
[2-5]
查找的字符,是2~5中的一个
2-46-9
查找的字符,是2~4或6~9中的一个
a-w2-5A-W
查找的字符,是a~w或2~5或A~W范围内的一个
[\u4e00-\u9fa5]
匹配中文字符
方括号内,普通的正则表达式符号不会被解释,. * ? ()不需要倒斜杠转义
4||| 分支条件
| (管道),适用于匹配多个表达式中的一个
5||| 捕获分组和非捕获分组
创建分组
用()圆括号进行分组
组号
对各分组,自动分配组号
组号分配的原则
从左到右,从外到内
通过组号,引用分组
\1:引用第1组
捕获分组
正则表达式中,用圆括号定义的分组,每个分组都会自动进行编号,并可以使用Match对象的group方法进行捕获,将匹配结果保存到内存中、这种分组,即捕获分组
非捕获分组
用圆括号进行分组是,在圆括号内的最前端加上“?:”,即不会编号,此即非捕获分组
6||| 零宽断言
用于查找指定内容之前或之后的内容,不包括指定内容
零宽度正预测先行断言
表达式为(?=exp)
查找exp表示的内容之前的内容
零宽度正回顾后发断言
表达式为(?<=exp)
查找exp表示的内容之后的内容
组合这两种情况,就可以查找指定内容之间的内容
7||| 负向零宽断言
用于断言指定位置的前面或后面不能匹配指定的表达式
零宽度负预测先行断言
表达式为(?!exp)
断言此位置的后面不能匹配表达式exp
零宽度负回顾后发断言
表达式为(?<!exp)
断言此位置的前面不能匹配表达式exp
负零宽断言在进行不定长表达式的匹配时,时常出错。建议搭配定长表达式
8||| 贪婪匹配与懒惰匹配
贪婪匹配
*、+,可以匹配尽可能多的字符
懒惰匹配
匹配尽可能少的字符
在贪婪匹配之后,添加一个“?”