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之再深点,更懂list
Sep 20 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
Apr 02 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
Python GUI编程 文本弹窗的实例
Jun 11 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
python logging 日志的级别调整方式
Feb 21 Python
opencv 图像腐蚀和图像膨胀的实现
Jul 07 Python
Python unittest生成测试报告过程解析
Sep 08 Python
python实现简单聊天功能
Jul 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
丧钟首部独立剧集《丧钟:骑士与龙》北美正式开播,场面血腥
2020/04/09 欧美动漫
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
php下几个常用的去空、分组、调试数组函数
2009/02/22 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP多维数组排序array详解
2017/11/21 PHP
Laravel中validation验证 返回中文提示 全局设置的方法
2019/09/29 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
JavaScript 监听textarea中按键事件
2009/10/08 Javascript
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
js生成随机数的过程解析
2015/11/24 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
浅谈javascript错误处理
2019/08/11 Javascript
[02:56]《DAC最前线》之国外战队抵达上海备战亚洲邀请赛
2015/01/28 DOTA
python 自动重连wifi windows的方法
2018/12/18 Python
详解python校验SQL脚本命名规则
2019/03/22 Python
详解Django 时间与时区设置问题
2019/07/23 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
关于Keras Dense层整理
2020/05/21 Python
Django REST 异常处理详解
2020/07/15 Python
亚洲最大的眼镜批发商和零售商之一:Glasseslit
2018/10/08 全球购物
Notino法国:购买香水和化妆品
2019/04/15 全球购物
三陽商会官方网站:Sanyo iStore
2019/05/15 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
劳动争议和解协议书范本
2014/11/20 职场文书
2014年应急工作总结
2014/12/11 职场文书
个人求职意向书
2015/05/11 职场文书
学生会主席任命书
2015/09/21 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL