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 相关文章推荐
linux下安装easy_install的方法
Feb 10 Python
python转换摩斯密码示例
Feb 16 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
Jul 13 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
python 图片去噪的方法示例
Jul 09 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
Python根据指定文件生成XML的方法
Jun 29 Python
python实现逻辑回归的示例
Oct 09 Python
python 实现mysql自动增删分区的方法
Apr 01 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
Jun 11 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从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
2013/09/25 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
详谈JS中实现种子随机数及作用
2016/07/19 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
js实现简易计算器功能
2019/10/18 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
Python安装图文教程 Pycharm安装教程
2018/03/27 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
Python字符串的常见操作实例小结
2019/04/08 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
用css3制作纸张效果(外翻卷角)
2013/02/01 HTML / CSS
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
粗加工管理制度
2014/02/04 职场文书
迎新春趣味活动方案
2014/08/24 职场文书
2015年采购员工作总结
2015/04/27 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
Python 阶乘详解
2021/10/05 Python
微信小程序APP页面的之间的相互传递参数以及自定义组件
2022/04/19 Javascript