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在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
快速解决安装python没有scripts文件夹的问题
Apr 03 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
python使用scrapy发送post请求的坑
Sep 04 Python
pytorch使用Variable实现线性回归
May 21 Python
python日志logging模块使用方法分析
May 23 Python
python3.6根据m3u8下载mp4视频
Jun 17 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
python实现高斯投影正反算方式
Jan 17 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
Python实现一个简单的递归下降分析器
Aug 01 Python
python开发入门——set的使用
Sep 03 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&MYSQL留言板源码
2020/07/19 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
js判断FCKeditor内容是否为空的两种形式
2013/05/14 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
JavaScript弹出新窗口后向父窗口输出内容的方法
2015/04/06 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
基于JavaScript实现一定时间后去执行一个函数
2015/12/14 Javascript
JS设置cookie、读取cookie
2016/02/24 Javascript
IONIC自定义subheader的最佳解决方案
2016/09/22 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息示例
2018/07/18 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
COS美国官网:知名服装品牌
2019/04/08 全球购物
给儿子的表扬信
2014/01/15 职场文书
2014年计划生育协会工作总结
2014/11/14 职场文书
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android