先说一个比较囧的事情:在写虾米音乐试听下载器的时候遇到一个问题,因为保存的文件都是用音乐的标题命名的,所以碰到一些诸如「対峙/out border」等含有非法字符(哼哼,说的就是你 →_→ Windows)的标题的时候,就会保存失败。于是我想起了迅雷的解决方法:把所有的非法字符替换成下划线。

于是就引入了正则表达式的使用。一番搜索囫囵吞枣后,我写下了这样的函数:

def sanitize_filename(filename):

returnre.sub('[/:*?<>|]','_', filename)

最近意识到了这个函数里的好多问题:

Python 和 Shell 不同,无论单引号还是双引号,反斜杠都是转义符。走狗屎运的是,Python 对于没意义的转义/的处理是保持原样。

即便如此,sanitize_filename('\/:*?<>|')依旧返回_______而不是全部都是下划线。

于是感觉得正正经经看看文档了。

Raw strings

看了文档后才意识到,Python 正则表达式模块的转义是独立的。例如匹配一个反斜杠字符需要将参数写成:'\\':

Python 将字符串转义:\\ 被转义为 \

re 模块获得传入的 \ 将其解释为正则表达式,按照正则表达式的转义规则将其转义为

如此麻烦的前提下,Raw String 就大有作为了,顾名思义就是(除了结尾的反斜杠)不会被转义的字符串。于是匹配一个反斜杠字符就可以写作 r'\'。

所以上面的 sanitize_filename 改成了:

def sanitize_filename(filename):

returnre.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)相关信息的方法。

>>>forminre.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

参考

python正则_Python 正则表达式(转义问题)相关推荐

  1. python正则_Python基础12之Python正则

    上图施工计划,已完成专题: 1.数字专题 2.字符串专题 3.列表专题 4.流程控制专题 5.编程风格专题 6.函数使用专题 7.面向对象编程(上篇) 8.面向对象编程(下篇) 9.Python基础9 ...

  2. python正则_python中正则匹配

    写代码时候,不管是爬虫,还是获取某些特定的资源,我们需要写正则表达式. 因为不常用,有些语法生疏.有时明明觉得自己的语法可以,可就是不行. 正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之 ...

  3. 判断是不是链接 正则_Python 正则表达式 保姆级教程,小学生都看得懂!!

    ~点击 蓝字 关注,获取更多资源~ 0 前言 上一篇文章,2020,还不会正则???,和小伙伴们一起学习了 Python 中的正则表达式,读完之后,总感觉少了点什么东西,无法尽兴?就好像爱你们的心少了 ...

  4. python 正则_python正则查找

    [转摘]PYTHON 正则表达式 网上转的一篇,把正则的规则系统的分类了.. 好文,共享,备查 ~~~~~~~~~~~ http://www.cnblogs.com/huxi/archive/2010 ...

  5. python正则_python的正则表达式

    上次小编写了正则表达式的用法,今天就小编就讲讲正则表达式再python中的应用,在python中想使用正则表达式就需要导入re模块. 接下来小编将先介绍re模块中几个常见的函数 findall: re ...

  6. python split 正则_Python 正则表达式:split

    作用:用正则表达式的字符分割字符串,正则的字符会被抛弃. 本文以 提取URL的地址与参数 为例,介绍re模块的split的用法: 返回值 -> 列表 复杂匹配 = re.compile(正则表达 ...

  7. python compile正则_Python 正则表达式:compile,match

    本文以匹配×××ID为例,介绍re模块的compile与match的用法 复杂匹配 = re.compile(正则表达式): 将正则表达式实例化 + re.match(要匹配的字符串): 从字符串开 ...

  8. python compile正则_Python 正则表达式:compile

    本文以匹配×××ID为例,介绍re模块的compile与match的用法 复杂匹配 = re.compile(正则表达式): 将正则表达式实例化 + re.match(要匹配的字符串): 从字符串开 ...

  9. python正则化_Python正则表达式

    Python正则表达式 Python正则表达式有一个模块"re",首先,在我们使用正则表达式的时候需要导入这个模块: import re 分三个部分来介绍Python正则表达式: ...

最新文章

  1. android 怎么判断activity 从哪里启动的
  2. JS中字符串的相关操作
  3. 为什么 Linux的开发者要转到Windows 10 平台!
  4. 图文并茂详解iptables 防火墙工作原理及知识点
  5. java数组编译后_Java中数组和集合的foreach操作编译后究竟是啥
  6. python文件下载速度 装饰器_python使用装饰器对文件进行读写操作'及遍历文件目录...
  7. 【Objective-C】05-第一个OC的类
  8. python程序的运行速度在所有计算机语言中最快_【编程专题】实测四种编程语言的运算速度,最快的竟然是它!...
  9. 【VM】—VM安装包
  10. [论文阅读] Pyramid Feature Attention Network for Saliency Detection
  11. ffffffffffffffffff
  12. shell 单词末尾家字符_58、最后一个单词的长度
  13. 郝斌数据结构与算法自学视频教程
  14. 几款软件需求分析工具
  15. SSM_config配置springmvc.xml模板
  16. opencms整合到java项目里_java-将标签云添加到OpenCMS网站
  17. 从0开始的python学习:编译原理实验1:程序语言的重复率检查
  18. python的内置函数
  19. SDM660 开机xbl中配置I2C
  20. python生成递归json_python函数、递归、json模块操作

热门文章

  1. 手机桌面宠物——星秀伴侣1.0手机版
  2. GAN生成对抗网络入门篇
  3. Eclipse快捷输入设置
  4. 中国特殊钢行业市场供需与战略研究报告
  5. 一个电商购物(B2C)网站性能测试需求
  6. 【Mysql学习日记2——修改】
  7. 计算机专业简历英文简历,计算机专业英文简历范文
  8. 设A和B是两个单链表,其表中元素递增有序,使用一算法将A和B归并成一个案元素递减有序的单链表C
  9. hydra安装与使用
  10. java 随机数random