python正则-re的用法详解


Posted in Python onJuly 28, 2019

天在刷题的时候用到了正则,用的过程中就感觉有点不太熟练了,很久没有用正则都有点忘了。所以现在呢,我们就一起来review一下python中正则模块re的用法吧。

今天是review,所以一些基础的概念就不做介绍了,先来看正则中的修饰符以及它的功能:

修饰符

•re.I 使匹配对大小写不敏感
•re.L 做本地化识别匹配
•re.M 多行匹配,影响^和$
•re.S 使.匹配包括换行在内的所有字符
•re.U 根据Unicode字符集解析字符.这个标志影响\w \W \b \B
•re.X 该标志通过给予你更灵活的格式以便你将正则表达式写的更易于理解.

模式

•^ 匹配字符串开头
•$ 匹配字符串结尾
•. 匹配人以字符,除了换行符号.当re.DOTAALL标记被指定时,则可以匹配包括换行符的任意字符.
•[...] 用来表示一组字符,单独列出:[amk]匹配a,m或k
•[^...] 不在[]中的字符:[^amk]匹配除amk之外的字符
•re* 匹配0个或多个的表达式
•re+ 匹配1个或多个的表达式
•re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式.
•re{n} 精准匹配n个前面表达式
•re{n,} 匹配大于等于n个前面表达式
•re{n,m} 匹配n到m个前面的表达式定义的片段,贪婪方式
•a|b 匹配a或b
•(re) 对正则表达式分组,并记住匹配的文本
•(?imx) 正则表达式包含三种可选标志,imx,只影响括号中的区域.
•(?-imx) 正则表达式关闭imx可选标志,只影响括号中的区域.
•(?:re) 类似(...)但不表示一个组
•(?imx:re) 在括号中使用imx可选标志
•(?-imx:re) 在括号中不是用imx可选标志
•(?#...) 注释
•(?=re) 前向肯定界定符.如果所含正则表达式,以...表示,在当前位置成功匹配时成功,否则失败.但一旦所含表达式已经尝试,匹配引擎根本没有提高,模式的剩余部分还要尝试界定符右边.
•(?!re) 前向否定界定符.与肯定界定符相反;当所含的表达式不能在字符串当前位置匹配成功时成功.
•(?>re) 匹配的独立模式,省去回朔.
•\w 匹配字符数字以及下划线
•\W 匹配非字母数字下划线
•\s 匹配任意空白字符,等价于[\t\n\r\f]
•\S 匹配任意非空白字符
•\d 匹配任意数字
•\D 匹配任意非数字
•\A 匹配字符串开始
•\Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串.
•\z 匹配字符串结束
•\G 匹配最后匹配完成的位置
•\b 匹配一个单词边界,也就是指单词和空格之间的位置
•\B 匹配非单词边界
•\n \t 匹配一个换行符,一个制表符
•\1...\9 匹配第n个分组的内容

上面这些呢,是我们会用到的一些模式,这里面绝大部分都是应该熟记于心的。

接下来我们看re的一些方法:

re.compile

这个方法会生成一个正则对象,他的第一个参数是正则字符串,第二个参数是修饰符,就是 re.I, re.S 这些。

生成的这个正则对象呢,它还有一些方法,比如match、findall、finditer、search等等,这些方法的用法请往下看。

re.match

match方法是从给定字符串的开头开始进行匹配,并且只匹配一次。也就是说如果字符串和正则的第一个字母就对不上那就匹配失败了。

ta的参数是pettern,string,flags

•pettern 就是正则字符串,如果是通过re.compile方法生成的正则对象.match来调用的话,就不需要这个参数了,因为正则对象本身就代表了一个正则匹配模式。

•string 就是要进行匹配的目标字符串

•flags 就是正则的修饰符,比如 re.I

match 如果匹配失败返回None,匹配惩罚返回的则是一个match对象。

match对象有一些方法,比较常用的有:span、group、groups等等
•span 方法返回的一个二元组,分别表示匹配字符串在目标字符串中的起始下标和结束下标
•group 函数有一个int类型的参数,参数为0表示返回正则匹配的字符串,参数为1返回正则中第一个组匹配的内容,2返回第二组的内容一次类推
•groups 函数是所有group函数结果组成一个元组。

re.search

search 函数和 match 函数是类似的,区别在于match方法是只在目标函数开头匹配一次;search函数是在整个目标函数上匹配一次,一次匹配成功后不再进行匹配。

同样search方法返回的也是一个match对象,用法和match方法返回的结果一样。

re.split

split 函数是用来分割字符串的一个函数。它的功能就是根据匹配的字符串对目标字符串进行分割,返回的结果是一个列表。

需要注意的是,如果正则中有组,组内的字符在结果列表中也会保留,不是组内的字符在结果列表中不会被保留。什么意思呢?通过一个例子来看一下:

st = 'www.baidu.com www.taobao.com'
result = re.split('bai(du)', st)
print(result)

结果:

['www.', 'du', '.com www.taobao.com']

可以看到,字符串‘du'是被括号括起来的,所以在结果中也有'du'这个元素,而'bai'没有被括号括起来,在结果中就不会有‘bai'这个元素。

re.findall

这个函数是我在爬虫项目中用的最多的一个函数了,它可以把所有匹配的结果以列表的形式返回,而不是像match和search一样只匹配一个结果。我们来试一下:

st = 'www.baidu.com www.taobao.com'
result = re.findall(r'www\.(\w*)\.(com)', st)
print(result)
[('baidu', 'com'), ('taobao', 'com')]
re.finditer

这个函数和findall的功能一样。不同之处在于这个函数返回的结果是一个生成器,而生成器中的每一项是一个match对象,我们一起来看一下:

st = 'www.baidu.com www.taobao.com'
result = re.finditer(r'www\.(\w*)\.(com)', st)
print(result.__next__().group(0, 1, 2))
print(next(result).groups(2))
('www.baidu.com', 'baidu', 'com')
('taobao', 'com')
re.sub

这个函数是用来替换字符串的。可以将匹配的字符串替换成指定的字符串,我们来看一下:

st = 'www.111.com www.222.com'
result = re.sub(r'\d+', 'OK', st)
print(result)

结果:

www.OK.com www.OK.com

我们的第二个参数除了可以是一个给定的字符串还可以是一个函数:

def toOK(matched):
  value = matched.group()
  return str(int(value)*2)
st = 'www.111.com www.222.com'
result = re.sub(r'\d+', toOK, st)
print(result)

结果:

www.222.com www.444.com

总结

以上所述是小编给大家介绍的python正则-re的用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
Apr 16 Python
Java及python正则表达式详解
Dec 27 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
Jun 19 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
python高斯分布概率密度函数的使用详解
Jul 10 Python
python数据类型之间怎么转换技巧分享
Aug 20 Python
pandas中遍历dataframe的每一个元素的实现
Oct 23 Python
python matplotlib 绘图 和 dpi对应关系详解
Mar 14 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
django ModelForm修改显示缩略图 imagefield类型的实例
Jul 28 #Python
django之对FileField字段的upload_to的设定方法
Jul 28 #Python
Django ImageFiled上传照片并显示的方法
Jul 28 #Python
Python线上环境使用日志的及配置文件
Jul 28 #Python
Django 实现admin后台显示图片缩略图的例子
Jul 28 #Python
处理python中多线程与多进程中的数据共享问题
Jul 28 #Python
在django中图片上传的格式校验及大小方法
Jul 28 #Python
You might like
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
JavaScript字符串对象substr方法入门实例(用于截取字符串)
2014/10/16 Javascript
js函数内变量的作用域分析
2015/01/12 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
JavaScript基础教程——入门必看篇
2016/05/20 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
解决vue的 v-for 循环中图片加载路径问题
2018/09/03 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
javascript头像上传代码实例
2019/09/28 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
通过PYTHON来实现图像分割详解
2019/06/26 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
2019/08/26 Python
Python终端输出彩色字符方法详解
2020/02/11 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
HTML5 Canvas概述
2009/08/26 HTML / CSS
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
自考生自我评价分享
2014/01/18 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
龙门石窟导游词
2015/02/02 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
追讨欠款律师函
2015/06/24 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python