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自动zip压缩目录的方法
Jun 28 Python
python实现自动重启本程序的方法
Jul 09 Python
Python使用MD5加密算法对字符串进行加密操作示例
Mar 30 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
django-csrf使用和禁用方式
Mar 13 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
Jun 02 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
Jun 29 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
python缺失值填充方法示例代码
Dec 24 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
WinXP + Apache +PHP5 + MySQL + phpMyAdmin安装全功略
2006/07/09 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
PHP实现的简单组词算法示例
2018/04/10 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
js 删除数组的几种方法小结
2014/02/21 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
javascript使用 concat 方法对数组进行合并的方法
2016/09/08 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
基于AngularJS的简单使用详解
2017/09/10 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
小程序云函数调用API接口的方法
2019/05/17 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
python中aioysql(异步操作MySQL)的方法
2019/04/11 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
2019/09/16 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
python 制作网站筛选工具(附源码)
2021/01/21 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
银行开业庆典方案
2014/02/06 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
学生周末长期请假条
2014/02/15 职场文书
感恩母亲节活动方案
2014/03/04 职场文书
2014年英语工作总结
2014/12/20 职场文书
巴黎圣母院观后感
2015/06/10 职场文书