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文本相似性计算之编辑距离详解
Nov 28 Python
python爬取拉勾网职位数据的方法
Jan 24 Python
python2.7无法使用pip的解决方法(安装easy_install)
Apr 03 Python
python进阶之多线程对同一个全局变量的处理方法
Nov 09 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
python使用插值法画出平滑曲线
Dec 15 Python
Python装饰器语法糖
Jan 02 Python
简单了解django索引的相关知识
Jul 17 Python
python函数调用,循环,列表复制实例
May 03 Python
python实现简易自习室座位预约系统
Jun 30 Python
Python语言内置数据类型
Feb 24 Python
Python利用zhdate模块实现农历日期处理
Mar 31 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
PHP面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
PHP 7的一些引人注目的新特性简单介绍
2015/11/08 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
jQuery select控制插件
2009/08/17 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
详解Nodejs 通过 fs.createWriteStream 保存文件
2017/10/10 NodeJs
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
JavaScript 链表定义与使用方法示例
2020/04/28 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
[34:44]Liquid vs TNC Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python画图学习入门教程
2016/07/01 Python
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
关于Python 的简单栅格图像边界提取方法
2019/07/05 Python
原生python实现knn分类算法
2019/10/24 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
keras 多任务多loss实例
2020/06/22 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
分厂厂长岗位职责
2013/12/29 职场文书
食品业务员岗位职责
2014/03/18 职场文书
家长对学生的评语
2014/04/18 职场文书
工程承包协议书范本
2014/09/29 职场文书
家长通知书家长意见
2015/06/03 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android