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实现Linux下守护进程的编写方法
Aug 22 Python
举例详解Python中的split()函数的使用方法
Apr 07 Python
Python实现股市信息下载的方法
Jun 15 Python
Python下载指定页面上图片的方法
May 12 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
django输出html内容的实例
May 27 Python
python实现海螺图片的方法示例
May 12 Python
django多文件上传,form提交,多对多外键保存的实例
Aug 06 Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 Python
Python基于进程池实现多进程过程解析
Apr 30 Python
python实现在列表中查找某个元素的下标示例
Nov 16 Python
Python Socket编程详解
Apr 25 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
德生S2000电路分析
2021/03/02 无线电
杏林同学录(七)
2006/10/09 PHP
PHP加速 eAccelerator配置和使用指南
2009/06/05 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
JavaScript知识点总结(四)之逻辑OR运算符详解
2016/05/31 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
JS身份证信息验证正则表达式
2017/06/12 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
numpy找出array中的最大值,最小值实例
2018/04/03 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
Python with语句和过程抽取思想
2019/12/23 Python
Python tkinter常用操作代码实例
2020/01/03 Python
python语言time库和datetime库基本使用详解
2020/12/25 Python
python lambda的使用详解
2021/02/26 Python
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
杭州-飞时达软件有限公司.net笔面试
2012/04/28 面试题
学生打架检讨书大全
2014/01/23 职场文书
小学生暑假安全公约
2015/07/14 职场文书
SQL Server 数据库实验课第五周——常用查询条件
2021/04/05 SQL Server
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers