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之玩转字符串(2)更新篇
Sep 28 Python
Python的Django框架下管理站点的基本方法
Jul 17 Python
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
Dec 19 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
python中强大的format函数实例详解
Dec 05 Python
python实现图片转字符小工具
Apr 30 Python
利用Django模版生成树状结构实例代码
May 19 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
完美处理python与anaconda环境变量的冲突问题
Apr 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
php 禁止页面缓存输出
2009/01/07 PHP
php快速url重写更新版[需php 5.30以上]
2010/04/25 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
php socket通信(tcp/udp)实例分析
2016/02/14 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
怎么让脚本或里面的函数在所有图片都载入完毕的时候执行
2006/10/17 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
PhotoSwipe异步动态加载图片方法
2016/08/25 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
ajax实现加载页面、删除、查看详细信息 bootstrap美化页面!
2017/03/14 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
vue登录注册及token验证实现代码
2017/12/14 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
安装多版本Vue-CLI的实现方法
2020/03/24 Javascript
Python导入txt数据到mysql的方法
2015/04/08 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
python3反转字符串的3种方法(小结)
2019/11/07 Python
python新式类和经典类的区别实例分析
2020/03/23 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
小学教师的个人自我鉴定
2013/10/24 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
Nginx实现会话保持的两种方式
2022/03/18 Servers
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL