导图社区 Python-正则表达式re
正则表达式是python中用于文本查询的一种高级查询模式,通过特定的模型去匹配文本数据。 本篇思维导图先从正则表达式的结构开始,在了解其结构之后,在看看正则表达式的编辑思路。最后将编辑号的正则表达式通过re模块中的函数或者将正则表达式对象的方法来执行,以获得我们想要的结果。 希望本篇思维导图,对您能有所帮助!
编辑于2024-01-30 16:18:14当运行程序时,数据会以变量、序列或者对象的形式,在程序中临时存储。但当程序运行结束之后,数据也随之消失。如果我们想长期保存数据,那么就需要将数据存储到磁盘文件中,这就需要通过Python读写文件,即I/O操作。I/O操作有三步:1、打开文件;2、文件读写;3、关闭文件(或者编写成with语句)。 本篇思维导图,即是围绕而操作的核心——文件对象(file_obj)来展开讲解,分为2个部分:一、file_obj的创建(open函数);二、file_obj的方法调用(读取文件、写入文件、文件指针以及最后的关闭文件)。 希望通过本篇思维导图,能帮助你对使用Python进行文件读写有更深的理解与认识!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的数字(包含整型、浮点型、复数)。 数字本身的内容不多,重点在其有多样的表现形式。然后,对数字的相关处理方式(运算 函数)。 值得注意的是,整型就是整数,但是,浮点型不等于小数,也表达不了分数。所有针对于小数及分数的运算,补充了Decimal类、Praction类的讲解部分。 最后,对于数字运算有重要关系的math模块,将相关的函数及特殊值进行汇总,希望对大家在用到数学运算的时侯带来帮助。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的文本(即字符串),以“时间顺序”将内容拆解为"创建、引用、操作、输出"四个部分。 1、字符串由引号直接创建,一些特殊的内容需要用到转义字符;当然,还需特别注意引号前的字母,对字符内容存在一定的影响; 2、字符串的引用,同列表一样,即索引与切片;但其属于不可变数据类型,不支持就地更改; 3、字符串的操作按照操作方式,分为“运算、函数、方法”三种方式,其字符串的方法非常丰富,特别将方法进行详细的梳理归纳,以便我们能更好的使用。 4、字符串输出部分,重点讲格式化输出,并对字符呈现起着关键作用的spec字段详细讲解,以便我们的文字内容能够更好的呈现。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
社区模板帮助中心,点此进入>>
当运行程序时,数据会以变量、序列或者对象的形式,在程序中临时存储。但当程序运行结束之后,数据也随之消失。如果我们想长期保存数据,那么就需要将数据存储到磁盘文件中,这就需要通过Python读写文件,即I/O操作。I/O操作有三步:1、打开文件;2、文件读写;3、关闭文件(或者编写成with语句)。 本篇思维导图,即是围绕而操作的核心——文件对象(file_obj)来展开讲解,分为2个部分:一、file_obj的创建(open函数);二、file_obj的方法调用(读取文件、写入文件、文件指针以及最后的关闭文件)。 希望通过本篇思维导图,能帮助你对使用Python进行文件读写有更深的理解与认识!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的数字(包含整型、浮点型、复数)。 数字本身的内容不多,重点在其有多样的表现形式。然后,对数字的相关处理方式(运算 函数)。 值得注意的是,整型就是整数,但是,浮点型不等于小数,也表达不了分数。所有针对于小数及分数的运算,补充了Decimal类、Praction类的讲解部分。 最后,对于数字运算有重要关系的math模块,将相关的函数及特殊值进行汇总,希望对大家在用到数学运算的时侯带来帮助。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
Python数据类型,从整体来看,以数字、文本为基础,用列表、字典、元组、集合作为容器;以性质划分,又分为可变与不可变数据。 本篇思维导图为大家讲解的即是Python中作为基础数据的文本(即字符串),以“时间顺序”将内容拆解为"创建、引用、操作、输出"四个部分。 1、字符串由引号直接创建,一些特殊的内容需要用到转义字符;当然,还需特别注意引号前的字母,对字符内容存在一定的影响; 2、字符串的引用,同列表一样,即索引与切片;但其属于不可变数据类型,不支持就地更改; 3、字符串的操作按照操作方式,分为“运算、函数、方法”三种方式,其字符串的方法非常丰富,特别将方法进行详细的梳理归纳,以便我们能更好的使用。 4、字符串输出部分,重点讲格式化输出,并对字符呈现起着关键作用的spec字段详细讲解,以便我们的文字内容能够更好的呈现。 本篇导图逻辑清晰、内容完整,希望能对想要深入学习Python的您带来帮助!
RE
正则表达式_regex
结 构
编 辑
应 用
match对象
re.match / re.search / re.finditer,涉及match_obj的处理
属性
match_obj.string
目标字符串
match_obj.re
regex对象
match_obj.pos
开始搜索位置的索引
match_obj.endpos
结束搜索位置的索引
match_obj.lastindex
最后一个分组的索引
match_.obj.lastgroup
最后一个分组的别名
方法
match.
group(n)
str,第n组匹配的字符串
groups()
tuple,全部分组捕获的字符串
groupdict()
dict,{name1(组名): text1(查找值)…}
start(n)
index,第n组字符串起始位置索引
end(n)
index,第n组字符串结束位置索引
span(n)
tuple,第n组开始位置、结束位置
expand(template)
用分组捕获的字符重构字符
template
\n
\g<id>、\g<name>
扫描器
scan方法扫描字符串时,依照程序返回一系列对象
re.Scanner
scanner_name = re.Scanner([ (tok_pattern1, func1), (tok_pattern2, func2), …])
tok_pattern
正则表达式
func
可调用对象
扫描器对象本身
scanner
对模式匹配到的字符串
tok_str
fun_name(scanner, tok_str)
tuple = scanner_name.scan(string)
tuple
(list, str)
(匹配成功存入列表,未匹配成功的str)
The end...
正则表达式_regex
regex应用
制图人:咖啡喵 制图时间:2024/1/14 制图软件:mindmaster
regex 执行过程
执 行
编译时
正则表达式
分析
编译
状态机
运行时
状态机
遍历
寻找匹配项
regex 应用
regex
直接应用
函数
查找搜索
re.match(regex)
re.search(regex)
re.findall(regex)
re.finditer(regex)
查找替换
re.sub(regex)
re.subn(regex)
分割字符
re.split(regex)
编译为对象
re.compile()
regex_obj
regex_obj.match()
regex_obj.search()
regex_obj.findall()
regex_obj.finditer()
查找搜索
regex_obj.sub()
regex_obj.subn()
查找替换
regex_obj.split()
分割字符
调用方法
函数 / 方法
在string(目标字符串)中,查找与pattern(regex)模式相匹配的子字符串(substr)【返回pattern对象,list,str等多种形式】
主体
pattern
string
regex
目标字符串
查找
substr
子字符串
如果是常用的regex,可以将其编译为一个regex_obj,再调用方法
regex_obj = re.compile(pattern[, flags])
单一查找
返回,pattern对象
re.match
查找1个substr,需匹配string开头
match_obj = re.match(pattern, string, flags=0)
re.search
在整个string中,查找到第1个substr
match_obj = re.search(pattern, string, flags=0)
查找
成功
Match对象
失败
None
全部查找
返回,list
re.findall
查找所有substr,放入list中
list = re.findall(pattern, string, flags=0)
如果regex用了分组,则返回元组列表(元组包含自足中找到的所有文本)
re.finditer
查找所有substr,以迭代器形式存储
match_obj_iterator = re.finditer(pattern,string,flags=0)
查找替换
返回,new_str
re.sub
查找所有的substr,用repl进行替换
str = re.sub(pattern, repl, string, count=0, flags=0)
re.subn
查找所有的substr,用repl进行替换
tuple = re.subn(pattern, repl, string[, count])
tuple
(new_str, count)
(新字符串,替换次数)
分割字符
返回,list
re.split
查找所有substr,将string分割,并存放list
list = re.split(pattern, string, maxsplit=0, flags=0)
flags
re.A
ASCII模式
re.I
字母
忽略大小写
re.L
\w
遵循当前的本地化设置
re.M
^
匹配行的开头(换行符之后的任何字符)
$
匹配行尾(换行符或字符末尾的最后一个字符)
re.S
.
匹配所有字符,包含\n
re.U
\w\d\s
用unicode格式匹配
re.X
VERBOSE
冗长模式,忽略空格
DEBUG
IDLE中执行操作时,将输出调试信息
To be continued!!!
正则表达式_regex
编辑思路
① 确立目标
② 分析结构
③ 开始编辑
制图人:咖啡喵 制图时间:2024/1/14 制图软件:mindmaster
电话号码
结 构
028-85581234
(028)85581234
前缀
2种形式选择
|
3个数字,接-
\d{3}-
()中3个数字
\(\d{3}\)
后缀
8个数字
\d{8}
regex
r'(\d{3}-|\(\d{3}\))\d{8}'
美式数字
结 构
1,000.001
千位分隔符、小数点
头部
1
1-3位数字,首位1-9
([1-9]\d{0,2})
中间
,000
千位分隔符,后接3为数字 可以重复 0-n次
(,\d{3})*
尾部
.001
小数点,后接数字,0-1次
{\.\d+}?
regex
r'([1-9]\d{0,2})(,\d{3})*(\.\d+)?'
搜索重复
结 构
'cat cat'
字符,空格,后又接相同的字符
regex
'(\w+) (\1)'
提取句子
结 构
头部
句子以大写字母开头
[A-Z]
中间
中间是任意字符
.*?
. 可以匹配换行符
re.S
尾部
句子以 .!?符号 结尾
[.!?]
符号后接一个空格+大写字母
或者符号后,接结尾符号
(?= [A-Z]|$)
$ 包含行尾
re.M
regex
'[A-Z].*?[.!?](?= [A-Z])|$'
re.M | re.S
To be continued!!!
正则表达式_regex
组成结构
制图人:咖啡喵 制图时间:2024/1/14 制图软件:mindmaster
字 符
文字字符
字母/数字
特殊字符
标点符号
\
赋予特殊含义
失去特殊含义
正则表达式结构
通过对特殊字符的组合,形成字符(单词、数字等)识别的一种模式。
元字符
字符集
分组
修饰符
贪婪匹配
惰性匹配
正向
负向
断言
先行
后行
元字符
匹配1个
用于指定特殊字符或字符集的工具,一次匹配一个字符
.
(除\n外)任何一个字符
re.S,将包含\n
^
匹配字符串开头
$
匹配字符串结尾
re.M
包含行开头
包含行结尾
\A
匹配字符串开头
\b
匹配词边界
\w
字母数字下画线
\d
匹配数字0-9
\s
匹配空白字符 (\t\n\r\f\v)
反 义
\z
\B
\W
\D
\S
字符集
匹配1个
[char_set],直接列出字符或者使用范围指定字符集.
[char_set]
匹配字符集中 任意一个字符
[^char_set]
反义
特殊字符
+*等特殊字符在字符集中会失去特殊含义
-
字符集中两字符之间
表示2个字符间的范围
^
位于字符集开头
匹配不在字符集中的字符
分 组
匹配组合
用()括号将多个表达式组合在一起
标记组
组号\n
分组时,自动分配组号
组号顺序
从左到右,从外到内: \1 \2 \3 …,引用组
取消标记
(?: expr)
命名组
(?p<name>expr)
通过名称标记
(?P = name)
引用命名组
注释
(#text)
内容不用于匹配,仅注释
条件匹配
(?(name)yespat|nopat)
(?(name)yespat)
(?(id)yespat|notpat)
(?(id)yespat)
修饰符
匹配数量
通过修饰符与表达式组合,生成重复数量的新表达式
*
expr*
对expr,匹配0次或多次
+
expr+
对expr,匹配1次或多次
?
expr?
对expr,匹配0次或1次
|
expr1 | expr2
匹配expr1或expr2
{}
expr{n}
对expr,匹配n次
expr{m,n}
对expr,匹配m~n次
expr{m,}
对expr,匹配m次以上
expr{,n}
对expr,匹配0~n次
注意:{}内不能有空格;m、n两端包含;| 优先级最低
贪婪匹配
存在多种成功匹配方式时,尽可能多的匹配文本
exp*、exp+
修饰符末尾添加 ?
惰性匹配
exp*?、exp+?
断言
正向先行
(?=expr)
当前位置之后的字符与expr相匹配
正向后行
(?!expr)
当前位置之后的字符与expr不匹配
负向先行
(?<=expr)
当前位置之前的字符与expr相匹配
负向后行
(?<!expr)
当前位置之前的字符与expr不匹配
匹配成功
<
当前位置前后字符
= !
是否匹配
To be continued!!!
正则表达式 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)
根据匹配进⾏切割字符串,并返回⼀个列表。
返回值
分割后的结果以列表形式返回
参数
pattern、string、flags
maxsplit
最大分割次数,默认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||| 贪婪匹配与懒惰匹配
贪婪匹配
*、+,可以匹配尽可能多的字符
默认贪婪匹配
懒惰匹配
匹配尽可能少的字符
在贪婪匹配之后,添加一个“?”