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的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
新手常见6种的python报错及解决方法
Mar 09 Python
Pycharm设置去除显示的波浪线方法
Oct 28 Python
通过python爬虫赚钱的方法
Jan 29 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
tensorflow实现训练变量checkpoint的保存与读取
Feb 10 Python
解决pyCharm中 module 调用失败的问题
Feb 12 Python
logging level级别介绍
Feb 21 Python
Python进程Multiprocessing模块原理解析
Feb 28 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
Jan 29 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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
日期 时间js控件
2009/05/07 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
浅析Prototype的模板类 Template
2011/12/07 Javascript
JavaScript字符串常用类使用方法汇总
2015/04/14 Javascript
浅析js中substring和substr的方法
2015/11/09 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
python模块之re正则表达式详解
2017/02/03 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
Python3.5集合及其常见运算实例详解
2019/05/01 Python
python小程序实现刷票功能详解
2019/07/17 Python
超实用的 30 段 Python 案例
2019/10/10 Python
Python3实现发送邮件和发送短信验证码功能
2020/01/07 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
python openssl模块安装及用法
2020/12/06 Python
美国电视购物:QVC
2017/02/06 全球购物
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
矫正人员思想汇报
2014/01/08 职场文书
医药营销个人求职信
2014/04/12 职场文书
社区活动总结范文
2015/05/07 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL