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 24 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
python 文件转成16进制数组的实例
Jul 09 Python
pycharm打开命令行或Terminal的方法
Jan 16 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
Python pymysql模块安装并操作过程解析
Oct 13 Python
python爬虫请求头的使用
Dec 01 Python
10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例
Dec 16 Python
使用pycharm运行flask应用程序的详细教程
Jun 07 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
ubuntu12.04使用c编写php扩展模块教程分享
2013/12/25 PHP
PHP模块memcached使用指南
2014/12/08 PHP
PHP使用递归算法无限遍历数组示例
2017/01/13 PHP
PHP实现读取文件夹及批量重命名文件操作示例
2019/04/15 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
javascript判断非数字的简单例子
2013/07/18 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
javascript实现图片跟随鼠标移动效果的方法
2015/05/13 Javascript
JQuery中基础过滤选择器用法实例分析
2015/05/18 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
pytz格式化北京时间多出6分钟问题的解决方法
2019/06/21 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
Pytorch中index_select() 函数的实现理解
2019/11/19 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
运动会入场解说词300字
2014/01/25 职场文书
有关打架的检讨书
2014/01/25 职场文书
自行车租赁公司创业计划书
2014/01/28 职场文书
班主任经验交流会主持词
2014/04/01 职场文书
大学生个人简历自荐信
2015/03/06 职场文书
2015年幼儿教育工作总结
2015/07/24 职场文书