Python 正则表达式(转义问题)


Posted in Python onDecember 15, 2014

先说一个比较?宓氖虑椋涸谛聪好滓衾质蕴?略仄鞯氖焙蛴龅揭桓鑫侍猓?蛭?4娴奈募?际怯靡衾值谋晏饷??模??耘龅揭恍┲钊纭??峙/out border」等含有非法字符(哼哼,说的就是你 →_→ Windows)的标题的时候,就会保存失败。于是我想起了迅雷的解决方法:把所有的非法字符替换成下划线。

于是就引入了正则表达式的使用。一番搜索囫囵吞枣后,我写下了这样的函数:

def sanitize_filename(filename):

return re.sub('[\/:*?<>|]', '_', filename)

最近意识到了这个函数里的好多问题:

  • Python 和 Shell 不同,无论单引号还是双引号,反斜杠都是转义符。走狗屎运的是,Python 对于没意义的转义 \/ 的处理是保持原样。
  • 即便如此,sanitize_filename('\\/:*?<>|') 依旧返回 \_______ 而不是全部都是下划线。

于是感觉得正正经经看看文档了。

Raw strings

看了文档后才意识到,Python 正则表达式模块的转义是独立的。例如匹配一个反斜杠字符需要将参数写成:'\\\\':

Python 将字符串转义:\\\\ 被转义为 \\
re 模块获得传入的 \\ 将其解释为正则表达式,按照正则表达式的转义规则将其转义为 \
如此麻烦的前提下,Raw String 就大有作为了,顾名思义就是(除了结尾的反斜杠)不会被转义的字符串。于是匹配一个反斜杠字符就可以写作 r'\\'。

所以上面的 sanitize_filename 改成了:

def sanitize_filename(filename):

return re.sub(r'[\\/:*?<>|]', '_', filename)

Regex 和 Match

于是正经看看 re 模块吧~以下为流水帐,供急性子观看。

Python 的正则表达式模块 re 中主要的对象其实是这俩:

正则表达式 RegexObject
匹配 MatchObject
RegexObject 是正则表达式对象,所有 match sub 之类的操作都归它所有。由 re.compile(pattern, flag) 生成。

>>> email_pattern = re.compile(r'\w+@\w+\.\w+')

>>> email_pattern.findall('My email is abc@def.com and his is user@example.com')

['abc@def.com', 'user@example.com']

其中的方法:

search 从任意字符开始匹配,返回 MatchObject 或者 None
match 从第一个字符开始匹配,返回 MatchObject 或者 None
split 返回由匹配分割的 List
findall 返回所有匹配的 List
finditr 返回 MatchObject 的迭代器
sub 返回替换后的字符串
subn 返回 (替换后的字符串, 替换次数)
re 模块里提供的函数如 re.sub re.match re.findall 实际上都可以认为是一种省去直接创建正则表达式对象的捷径。而由于 RegexObject 对象本身可以反复使用,这也是它相对于这些捷径函数的优势所在。

MatchObject 则是匹配对象,表示一次正则表达式匹配的结果。由 RegexObject 的一些方法返回。匹配对象永远是 True 的,另外还有一大堆用来取得正则表达式中分组(group)相关信息的方法。

>>> for m in re.finditer(r'(\w+)@\w+\.\w+', 'My email is abc@def.com and his is user@example.com'):

... print '%d-%d %s %s' % (m.start(0), m.end(0), m.group(1), m.group(0))

...

12-23 abc abc@def.com

35-51 user user@example.com
参考
  • The Python Standard Library: http://docs.python.org/2/library/re.html
Python 相关文章推荐
理解Python中函数的参数
Apr 27 Python
Python的消息队列包SnakeMQ使用初探
Jun 29 Python
pytorch构建网络模型的4种方法
Apr 13 Python
Django中的Model操作表的实现
Jul 24 Python
PyCharm设置每行最大长度限制的方法
Jan 16 Python
python协程之动态添加任务的方法
Feb 19 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
Python企业编码生成系统总体系统设计概述
Jul 26 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
利用python控制Autocad:pyautocad方式
Jun 01 Python
python 读取.nii格式图像实例
Jul 01 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
Dec 10 Python
python正则表达式中的括号匹配问题
Dec 14 #Python
python的类方法和静态方法
Dec 13 #Python
Python计算程序运行时间的方法
Dec 13 #Python
Python编程中的反模式实例分析
Dec 08 #Python
Python实现拼接多张图片的方法
Dec 01 #Python
python字符串替换的2种方法
Nov 30 #Python
Python中3种内建数据结构:列表、元组和字典
Nov 30 #Python
You might like
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
php中{}大括号是什么意思
2013/12/01 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
PHP7新功能总结
2019/04/14 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
javascript 文档的编码问题解决
2009/03/01 Javascript
半角全角相互转换的js函数
2009/10/16 Javascript
jquery下组织javascript代码(js函数化)
2010/08/25 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
利用Javascript实现简单的转盘抽奖
2017/02/13 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
2017/04/25 jQuery
Vuex的API文档说明详解
2020/02/05 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
python使用any判断一个对象是否为空的方法
2014/11/19 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
2016/01/20 Python
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
Python找出最小的K个数实例代码
2018/01/04 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
Python中面向对象你应该知道的一下知识
2019/07/10 Python
实例详解Python装饰器与闭包
2019/07/29 Python
浅析Python 责任链设计模式
2020/09/11 Python
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
办公室内勤工作职责
2013/12/11 职场文书
歌唱比赛获奖感言
2014/01/21 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
4S店售后客服自我评价
2014/04/09 职场文书
考察现实表现材料
2014/05/19 职场文书
大专学生求职自荐信
2014/07/06 职场文书
家庭贫困证明书(3篇)
2014/09/15 职场文书
教育见习报告范文
2014/11/03 职场文书
《思路决定出路》读后感3篇
2019/12/11 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
python实现股票历史数据可视化分析案例
2021/06/10 Python
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS