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的Flask框架中实现全文搜索功能
Apr 20 Python
利用python实现命令行有道词典的方法示例
Jan 31 Python
python3.x上post发送json数据
Mar 04 Python
python采集微信公众号文章
Dec 20 Python
pyqt5之将textBrowser的内容写入txt文档的方法
Jun 21 Python
wxpython绘制圆角窗体
Nov 18 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
tensorflow 限制显存大小的实现
Feb 03 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
Apr 19 Python
python批量修改交换机密码的示例
Sep 22 Python
基于Python实现天天酷跑功能
Jan 06 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 防止单引号,双引号在接受页面转义
2008/07/10 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
2016/08/23 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
juqery 学习之四 筛选查找
2010/11/30 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
IE6-IE9不支持table.innerHTML的解决方法分享
2012/09/14 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
2015/09/04 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
js实现for循环跳过undefined值示例
2019/07/02 Javascript
JavaScript 继承 封装 多态实现及原理详解
2019/07/29 Javascript
解决layui数据表格table的横向滚动条显示问题
2019/09/04 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
js脚本中执行java后台代码方法解析
2019/10/11 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
python中的字符串内部换行方法
2018/07/19 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
详解python之heapq模块及排序操作
2019/04/04 Python
python对文件的操作方法汇总
2020/02/28 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
应届护士推荐信
2013/11/16 职场文书
新闻编辑自荐书范文
2014/02/12 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书