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 相关文章推荐
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
Python复数属性和方法运算操作示例
Jul 21 Python
python复制文件到指定目录的实例
Apr 27 Python
python实现可视化动态CPU性能监控
Jun 21 Python
python中如何使用分步式进程计算详解
Mar 22 Python
flask实现验证码并验证功能
Dec 05 Python
简单了解为什么python函数后有多个括号
Dec 19 Python
python requests模拟登陆github的实现方法
Dec 26 Python
Python程序控制语句用法实例分析
Jan 14 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
python3实现飞机大战
Nov 29 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 一元分词算法
2009/11/30 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
php利用单例模式实现日志处理类库
2014/02/10 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
如何实现JS函数的重载
2006/09/22 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
Vue toFixed保留两位小数的3种方式
2020/10/23 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
Django静态资源URL STATIC_ROOT的配置方法
2014/11/08 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
python3 xpath和requests应用详解
2020/03/06 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
HTML5图片层叠的实现示例
2020/07/07 HTML / CSS
Monnier Frères美国官网:法国知名奢侈品网站
2016/11/22 全球购物
Hashtable 添加内容的方式有哪几种,有什么区别?
2012/04/08 面试题
几个Shell Script面试题
2014/04/18 面试题
英文简历中的自我评价
2013/10/06 职场文书
表彰会主持词
2014/03/26 职场文书
节约用水标语
2014/06/11 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
2014年销售人员工作总结
2014/11/27 职场文书
幼儿园辞职书
2015/02/26 职场文书
投资申请报告
2015/05/19 职场文书