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中定义结构体的方法
Mar 04 Python
PyQt5 QSerialPort子线程操作的实现
Apr 21 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
详解PANDAS 数据合并与重塑(join/merge篇)
Jul 09 Python
Python3分析处理声音数据的例子
Aug 27 Python
python生成随机红包的实例写法
Sep 02 Python
Python连接字符串过程详解
Jan 06 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
django实现模型字段动态choice的操作
Apr 01 Python
Python基于QQ邮箱实现SSL发送
Apr 26 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
tensorflow中的数据类型dtype用法说明
May 26 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 getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
PHP通过API获取手机号码归属地
2015/05/28 PHP
php实现分页显示
2015/11/03 PHP
php反射类ReflectionClass用法分析
2016/05/12 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
jquery中页面Ajax方法$.load的功能使用介绍
2014/10/20 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
2009/04/09 Python
go和python调用其它程序并得到程序输出
2014/02/10 Python
Python迭代用法实例教程
2014/09/08 Python
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python容器类型公共方法总结
2020/08/19 Python
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
AJAX检测用户名是否存在的方法
2021/03/24 Javascript
大学本科毕业生求职信范文
2013/12/18 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
产品包装策划方案
2014/05/18 职场文书
孝老爱亲模范事迹材料
2014/05/25 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
困难补助申请报告
2015/05/19 职场文书
工作年限证明模板
2015/06/15 职场文书
初中毕业感言300字
2015/07/31 职场文书
2016年优秀党员教师先进事迹材料
2016/02/29 职场文书
java executor包参数处理功能 
2022/02/15 Java/Android