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实现程序的单一实例用法分析
Jun 03 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
用十张图详解TensorFlow数据读取机制(附代码)
Feb 06 Python
Python从零开始创建区块链
Mar 06 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
解决Django加载静态资源失败的问题
Jul 28 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
python词云库wordcloud的使用方法与实例详解
Feb 17 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
php+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
php单元测试phpunit入门实例教程
2017/11/17 PHP
PHP析构函数destruct与垃圾回收机制的讲解
2019/03/22 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
博客侧边栏模块跟随滚动条滑动固定效果的实现方法(js+jquery等)
2013/03/24 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
JavaScript按位运算符的应用简析
2014/02/04 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
javascript实现瀑布流加载图片原理
2016/02/02 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
jQuery基本选择器(实例及表单域value的获取方法)
2016/05/20 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
纯js实现隔行变色效果
2017/11/29 Javascript
Angular服务Request异步请求的实例讲解
2018/08/13 Javascript
解决vuex数据异步造成初始化的时候没值报错问题
2019/11/13 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python探索之创建二叉树
2017/10/25 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
python输入错误后删除的方法
2019/10/12 Python
小区门卫岗位职责
2013/12/31 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
2014乡镇党政班子四风问题思想汇报
2014/09/14 职场文书
完整版商业计划书
2014/09/15 职场文书
婚礼双方父亲致辞
2015/07/27 职场文书
七年级语文教学反思
2016/03/03 职场文书
排查MySQL生产环境索引没有效果
2022/04/11 MySQL