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计算日期之间的放假日期
Jun 05 Python
根据DataFrame某一列的值来选择具体的某一行方法
Jul 03 Python
对python sklearn one-hot编码详解
Jul 10 Python
python3使用flask编写注册post接口的方法
Dec 28 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
python标准库os库的函数介绍
Feb 12 Python
python闭包、深浅拷贝、垃圾回收、with语句知识点汇总
Mar 11 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
Apr 30 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
python 实现客户端与服务端的通信
Dec 23 Python
Django migrate报错的解决方案
May 20 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 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 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
Zend Framework框架路由机制代码分析
2016/03/22 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
2011/01/12 Javascript
获取数组中最大最小值方法js代码(自写)
2013/08/12 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
AngularJS中的按需加载ocLazyLoad示例
2017/01/11 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
2018/10/09 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
python中global与nonlocal比较
2014/11/21 Python
python自动翻译实现方法
2016/05/28 Python
Python3中的json模块使用详解
2018/05/05 Python
django允许外部访问的实例讲解
2018/05/14 Python
多个应用共存的Django配置方法
2018/05/30 Python
python中的colorlog库使用详解
2019/07/05 Python
python如何调用字典的key
2020/05/25 Python
CAT鞋英国官网:坚固耐用的靴子和鞋
2016/10/21 全球购物
母亲七十大寿答谢词
2014/01/18 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
竞聘演讲稿开场白
2014/08/25 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书