Python正则re模块详解
目录
re.match
re.fullmatch
re.search
re.sub
re.subn
re.split
re.findall
re.finditer
re.compile
re.purge
re.escape
阅读本文章时,已默认您对正则表达式有了一定的了解。该教程是对Python的re模块的介绍及注意点提示,希望对您有一定的帮助,如果有解释不到位的地方,还请各位朋友帮忙指出,大家一起进步。好了,那就让我们开始Python正则之旅吧!
最好的学习资料是官方文档,那我们先来看下Python文档里面的介绍,我的版本是Python3.7.2。
import re
help(re)
可以看到目前的Python版本re模块里面包含了以下几个正则相关的方法:
现在我们就按这个顺序来介绍下这几个方法。
re.match
根据官方的介绍,我们可以知道该方法有三个参数 :
- pattern 表示传进来的正则表达式
- string 表示被匹配的字符串
- flags 正则表达式匹配的模式
如下,目前支持7种模式:
对应的中文解释
- A 该模式会让正则表达式以ASCII字符集去匹配字符串,而不是以Unicode。主要影响的正则有
\w、\W、\d、\D、\b、\B
- I 忽略大小写
- L 该模式会使以下正则根据本地环境去匹配
\w、\W、\b、\B
- M 多行模式匹配,影响^和$
- S 会使.元字符匹配所有字符,包括换行符
- X 忽略空白符和注释,主要用于书写正则的格式,添加注释等,为了更好的解释所写的正则
- U 根据Unicode字符集匹配字符串
接下来,我们就用代码来验证该方法:
该方法是从字符串的起始位置开始匹配字符串。如果匹配上,则会返回一个对象,否则返回None
来看两个例子,你就明白了
demo1
import re
result=re.match(r"\d+","abc123")
print(result)
结果如下:
None
demo2
import re
result=re.match(r"\d+","123abc")
print(result)
<re.Match object; span=(0, 3), match='123'>
看到这里,我想你应该明白re.match这个方法的用法了吧。后面我们会把该方法和re.search做比较。现在我们再来看看,返回的这个Match对象对应的类的一个介绍。
在这里可以看到,re.match()和re.search()返回的结果都是Match这个类的一个实例 对象
下图是该类的几个比较常用的方法:
re.fullmatch
该方法需要整个字符串跟正则完全匹配才会返回一个Match对象,否则返回None
demo1
import re
result=re.fullmatch(r"\d+","123abc")
print(result)
结果:
None
demo2
import re
result=re.fullmatch(r"\d+","123")
print(result)
<re.Match object; span=(0, 3), match='123'>
re.search
该方法会根据传入的正则去扫描整个字符串,若能找到对应的子字符串,则返回该Match对象,否则返回None。这里返回的Match对象保存的是从左到右匹配到的第一个子字符串的信息。
demo1
import re
result=re.search(r"\d+","abc123")
print(result)
<re.Match object; span=(3, 6), match='123'>
demo2
import re
result=re.search(r"\d+","abc1kkk")
print(result)
<re.Match object; span=(3, 4), match='1'>
demo3
import re
result=re.search(r"\d+","abckkk")
print(result)
None
可以看到,re.match和re.search都是在字符串中查找字符串,但区别是
- re.match 字符串的开始位置的字符串必须匹配该正则,否则返回None。你可以理解为startWith的意思
- re.search 从左到右匹配,只要字符串中的任意一个子串能匹配到该正则,则返回匹配到的第一个子字符串的信息。你可以理解为包含的意思
来看几个等价的demo
import re
result=re.search(r"\A\d+","abc1kkk")
print(result)
result=re.match(r"\d+","abc1kkk")
print(result)
result=re.search(r"^\d+","abc1kkk")
print(result)
上面这几个代码的执行结果的一样的,代码所表示的含义也是一样的。寻找的是开头位置的数字
re.sub
这个方法的作用是字符串替换,其中,rep1可以是字符串,也可以是一个方法。
- 当rep1是一个字符串时,里面的转义字符会被加工处理。这里怎么理解呢?也就是说,是特殊符号的,会被转为对应的意思,rep1里面的\n会被处理为换行符,\r会被处理成回车换行符,不确定的转义符不会处理,例如\&等。如果是向后引用的,则会替换成对应的引用组捕获的内容,例如,\1会被替换成group(1)的内容,\2会被替换成group(2)的内容。
- 当rep1是一个方法时,该方法的入参是一个Match对象,并且必须有返回值
rep1为字符串时的例子如下:
import re
#在每个匹配结果前后加上-
result=re.sub(r"(\d+)",r"-\1-","abc1kk2k")
print(result)
#错误的写法,rep1前面没有加r
result=re.sub(r"(\d+)","-\1-","abc1kk2k")
print(result)
abc-1-kk-2-k
abc--kk--k
结果分析,从结果上面可以看到,当rep1字符串前面没有加上r标识符的时候,里面的\1会被按特殊字符处理为它表示的意思,而加上r标识符之后,结果才是正常的。当然,你可以像下面这么写:
import re
result=re.sub(r"(\d+)","-\g<1>-","abc1kk2k")
print(result)
result=re.sub(r"(\d+)",r"-\g<1>-","abc1kk2k")
print(result)
result=re.sub(r"\d+",r"-\g<0>-","abc1kk2k")
print(result)
result=re.sub(r"\d+","-\g<0>-","abc1kk2k")
print(result)
result=re.sub(r"(?P<num>\d+)",r"-\g<num>-","abc1kk2k")
print(result)
result=re.sub(r"(?P<num>\d+)","-\g<num>-","abc1kk2k")
print(result)
那如果我们需要把匹配到的每个数字加1,要怎么写呢?这个时候就需要在rep1传入一个function方法了:
demo1
import re
def add(m):return str(int(m.group())+1)
result=re.sub(r"\d+",add,"abc1kk2k")
print(result)
demo2
import re
result=re.sub(r"\d+",lambda m:str(int(m.group())+1),"abc1kk2k")
print(result)
demo3
import re
result=re.sub(r"(?P<num>\d+)",lambda m:str(int(m.group("num"))+1),"abc1kk2k")
print(result)
re.subn
该方法除了会多返回一个替换次数的结果外,其他功能都与sub一样。返回结果是一个tupl
import re
result=re.subn(r"(\d+)",r"-\1-","abc1kk2k4")
print(result)
result=re.sub(r"(\d+)",r"-\1-","abc1kk2k4")
print(result)result=re.subn(r"(\d+)",r"-\1-","abc1kk2k4",2)
print(result)
result=re.sub(r"(\d+)",r"-\1-","abc1kk2k4",2)
print(result)
结果:
('abc-1-kk-2-k-4-', 3)
abc-1-kk-2-k-4-
('abc-1-kk-2-k4', 2)
abc-1-kk-2-k4
re.split
如果pattern没有捕获组的话,则按照正则分割后,返回一个list结果集;如果pattern里面包含捕获组的话,list结果集里面包含捕获组获取到的内容
import re
result=re.split(r"\d+","abc11kk22k34")
print(result)
result=re.split(r"(\d+)","abc11kk22k34")
print(result)result=re.split(r"\d+","abc11kk22k34",2)
print(result)
result=re.split(r"(\d+)","abc11kk22k34",2)
print(result)
['abc', 'kk', 'k', '']
['abc', '11', 'kk', '22', 'k', '34', '']
['abc', 'kk', 'k34']
['abc', '11', 'kk', '22', 'k34']
re.findall
- pattern 没有捕获组的话,该方法会返回所有匹配结果的list
- pattern 包含一个或多个捕获组的话,list保存的结果是这些捕获组的匹配结果,且list里面的各项都是一个tuples
import re
result=re.findall(r"[a-z]+\d+","abc11kk22k34")
print(result)
result=re.findall(r"[a-z]+(\d+)","abc11kk22k34")
print(result)
result=re.findall(r"([a-z]+)(\d+)","abc11kk22k34")
print(result)
result=re.findall(r"([a-z]+)(\d+)()()()","abc11kk22k34")
print(result)
['abc11', 'kk22', 'k34']
['11', '22', '34']
[('abc', '11'), ('kk', '22'), ('k', '34')]
[('abc', '11', '', '', ''), ('kk', '22', '', '', ''), ('k', '34', '', '', '')]
re.finditer
返回一个迭代器,迭代器里面的每个对象都是Match类型的数据
import re
result=re.finditer(r"\d+","abc11kk22k34")
for m in result:print(m.group(0))
print()
result=re.finditer(r"(\d+)","abc11kk22k34")
for m in result:print(m.group(0))print(m.group(1))
re.compile
编译正则,返回一个Pattern对象。 这样做的目的是可以重复使用该正则模式对象
该Pattern类有如下方法
re.purge
清除正则表达式缓存
re.escape
转义特殊字符,就是把有特殊意义的字符串转义为普通字符串
Python正则re模块详解相关推荐
- python之sys模块详解_(转)python之os,sys模块详解
python之sys模块详解 原文:http://www.cnblogs.com/cherishry/p/5725184.html sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和 ...
- 【Python】python之subprocess模块详解
[Python]python之subprocess模块详解 subprocess模块 subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/out ...
- Python的pickle模块详解(包括优缺点及和JSON的区别)
文章目录 一.pickle是什么? 1.pickle的优缺点 2.pickle和JSON的区别 3.pickle的应用总结 二.pickle的用法 1. pickle接口 2. pickle实例 结语 ...
- python中logging模块详解_python logging日志模块详解
logging 日志模块详解 用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这 ...
- python当中时间模块详解,包括time,timeit,datatime
目录 time 模块 -- 时间获取和转换 以下三个比较常见: time.perf_counter() time.process_time() time.sleep(secs) timeit 模块详解 ...
- Python的PyYAML模块详解
文章目录 注:原文链接 简介 安装 简单安装 从源码安装 最常被问到的问题 使用详解 加载YAML 转储YAML 构造.表示和解析 YAML语法 文档 块序列 块映射 流集合 标量 别名 标签 YAM ...
- python之re模块详解
re模块 功能:用来匹配字符串(动态.模糊的匹配),爬虫用的多. 一.常用方法: match():从头匹配 search():从整个文本搜索 findall():找到所有符合的 split():分割 ...
- Python中time模块详解
转载自:http://qinxuye.me/article/details-about-time-module-in-python/ 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间 ...
- Python os.path() 模块 详解 附算例
Python os.path() 模块 函数 说明 os.path.abspath(path) 返回绝对路径 os.path.basename(path) 返回文件名 os.path.commonpr ...
最新文章
- SLAM的通用框架:GSLAM
- 业务系统性能优化——缓存
- 【Python学习系列二十】scikit-learn库模型持久化
- oracle 日志注册,Oracle日常维护中管理用户以及重做日志文件的方法
- pycharm里怎么关闭一个项目_【周末分享】一个完整的项目复盘到底要怎么做?...
- c语言行列倒置算法,循环行列的元素倒置。求指点
- 自己动手,实现一种类似ListT的数据结构(二)
- 算法3-------最长子序列和
- P2023 [AHOI2009]维护序列
- AAuto如何设置定时器
- Nhibernate3.3.3sp1基础搭建测试
- matlab习题二,matlab习题二答案.doc
- 开放源代码是如何吞噬软件的
- CAN总线之总线逻辑值
- 《幸福来敲门》观后感
- ABAP BDC使用EXCEL模板批量修改物料
- 017~022 函数 课后练习题
- 设计原则:里式替换原则(LSP)
- 调用高德地图Api实现通过地址转经纬度
- 圆形标定板_机器视觉学习笔记(2)--如何检测圆点标定板
热门文章
- 1万小时缔造的世界第一程序员
- 利用四位共阳数码管显示小数
- 【node.js】一个基于HTPP的服务
- 基于python的Django框架 企业公司网站设计与实现毕业设计毕设参考
- linux网络测速qerf,kehu.one在线网速测试,网站测速工具,测网速,网站访问速度测试-boce.com...
- Win10系统重置后键盘鼠标都失灵,光标都不显示怎么解决?
- BurpSuite-Collaborator插件介绍 附最新burp破解版地址
- 猿创征文 | Git的良心教程
- 代码审计| HDWiki 漏洞(一)
- 第三届全国大学生算法设计与编程挑战赛 (冬季赛)部分题解