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实现从百度API获取天气的方法
Mar 11 Python
深入理解Python中命名空间的查找规则LEGB
Aug 06 Python
Python 基础教程之包和类的用法
Feb 23 Python
python2.6.6如何升级到python2.7.14
Apr 08 Python
python格式化输出保留2位小数的实现方法
Jul 02 Python
Atom Python 配置Python3 解释器的方法
Aug 28 Python
在vscode中配置python环境过程解析
Sep 28 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 Python
Django 5种类型Session使用方法解析
Apr 29 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
学会Python数据可视化必须尝试这7个库
Jun 16 Python
openstack中的rpc远程调用的方法
Jul 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
PHP 高手之路(一)
2006/10/09 PHP
解决ajax+php中文乱码的方法详解
2013/06/09 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
jquery插件制作 表单验证实现代码
2012/08/17 Javascript
理解javascript中的原型和原型链
2015/07/30 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
jQuery布局组件EasyUI Layout使用方法详解
2017/02/28 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
Vue.js 点击按钮显示/隐藏内容的实例代码
2018/02/08 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
2018/08/25 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
python实现ipsec开权限实例
2014/11/11 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
Python3 实现随机生成一组不重复数并按行写入文件
2018/04/09 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
对django views中 request, response的常用操作详解
2019/07/17 Python
CSS实现聊天气泡效果
2020/04/26 HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
维也纳通行证:Vienna PASS
2019/07/18 全球购物
研讨会主持词
2014/04/02 职场文书
园林技术专业求职信
2014/07/28 职场文书
优秀高中学生评语
2014/12/30 职场文书
oracle索引总结
2021/09/25 Oracle
详解Oracle块修改跟踪功能
2021/11/07 Oracle
MySQL中order by的使用详情
2021/11/17 MySQL