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的内存泄漏及gc模块的使用分析
Jul 16 Python
Python中字符串的修改及传参详解
Nov 30 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
Python使用正则表达式抓取网页图片的方法示例
Apr 21 Python
CentOS7下python3.7.0安装教程
Jul 30 Python
python看某个模块的版本方法
Oct 16 Python
python 生成图形验证码的方法示例
Nov 11 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
python修改FTP服务器上的文件名
Sep 11 Python
详解python破解zip文件密码的方法
Jan 13 Python
tensorflow 报错unitialized value的解决方法
Feb 06 Python
Python 中的pygame安装与配置教程详解
Feb 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中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
YII Framework框架教程之日志用法详解
2016/03/14 PHP
Laravel5.5新特性之友好报错以及展示详解
2017/08/13 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
2019/03/14 PHP
PHP钩子实现方法解析
2019/05/21 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
javascript数组去掉重复
2011/05/12 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
javascript表单正则应用
2017/02/04 Javascript
微信小程序的tab选项卡的实现效果
2019/05/15 Javascript
优化Vue项目编译文件大小的方法步骤
2019/05/27 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
python dict remove数组删除(del,pop)
2013/03/24 Python
Python中为什么要用self探讨
2015/04/14 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
python生成式的send()方法(详解)
2017/05/08 Python
python如何获取服务器硬件信息
2017/05/11 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
Python 网络爬虫--关于简单的模拟登录实例讲解
2018/06/01 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
Python 线程池用法简单示例
2019/10/02 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
大学毕业感言100字
2014/02/03 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
企业党建工作总结2015
2015/05/26 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
2015大学迎新标语
2015/07/16 职场文书
校运会加油稿大全
2015/07/22 职场文书
小学教师教育随笔
2015/08/14 职场文书
导游词之井冈山
2019/11/20 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL