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 26进制计算实现方法
May 28 Python
在Python的Django框架中为代码添加注释的方法
Jul 16 Python
分享python数据统计的一些小技巧
Jul 21 Python
pycharm远程调试openstack代码
Nov 21 Python
Python实现多属性排序的方法
Dec 05 Python
pyqt5 删除layout中的所有widget方法
Jun 25 Python
Python实现Singleton模式的方式详解
Aug 08 Python
Python学习笔记之Break和Continue用法分析
Aug 14 Python
Pytorch 多维数组运算过程的索引处理方式
Dec 27 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 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分页函数
2006/07/08 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
php获取bing每日壁纸示例分享
2014/02/25 PHP
jquery简单体验
2007/01/10 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
js实现收缩菜单效果实例代码
2013/10/30 Javascript
node.js中使用q.js实现api的promise化
2014/09/17 Javascript
JavaScript判断对象是否为数组
2015/12/22 Javascript
Javascript的表单与验证-非空验证
2016/03/18 Javascript
关于JS中二维数组的声明方法
2016/09/24 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
Javascript中click与blur事件的顺序详析
2017/04/25 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
python用字典统计单词或汉字词个数示例
2014/04/22 Python
在Python的循环体中使用else语句的方法
2015/03/30 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
利用Python在一个文件的头部插入数据的实例
2018/05/02 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
Python守护进程实现过程详解
2020/02/10 Python
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
优秀中专生推荐信
2013/11/17 职场文书
乡下人家教学反思
2014/02/01 职场文书
公立医院改革实施方案
2014/03/14 职场文书
汽车销售经理岗位职责
2014/06/09 职场文书
作文批改评语
2014/12/25 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
2015年人事科工作总结
2015/04/28 职场文书
网聊搭讪开场白
2015/05/28 职场文书
监守自盗观后感
2015/06/10 职场文书
tensorflow+k-means聚类简单实现猫狗图像分类的方法
2021/04/28 Python
Python批量将csv文件转化成xml文件的实例
2021/05/10 Python
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android