Python 正则表达式(转义问题)

 更新时间:2014年12月15日 00:01:53   投稿:mdxy-dxy  
这篇文章主要介绍了Python 正则表达式(转义问题),需要的朋友可以参考下

先说一个比较囧的事情:在写虾米音乐试听下载器的时候遇到一个问题,因为保存的文件都是用音乐的标题命名的,所以碰到一些诸如「対峙/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

参考

相关文章

  • Python3.9新特性详解

    Python3.9新特性详解

    这篇文章主要介绍了Python3.9新特性详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 进一步理解Python中的函数编程

    进一步理解Python中的函数编程

    这篇文章主要介绍了进一步理解Python中的函数编程,本文进一步讨论了Python中函数编程的一些要点,来自IBM官方技术文档,需要的朋友可以参考下
    2015-04-04
  • python连接PostgreSQL数据库的过程详解

    python连接PostgreSQL数据库的过程详解

    这篇文章主要介绍了python连接PostgreSQL数据库的过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • python pandas读取csv后,获取列标签的方法

    python pandas读取csv后,获取列标签的方法

    今天小编就为大家分享一篇python pandas读取csv后,获取列标签的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python脚本提取fasta文件单序列信息实现

    Python脚本提取fasta文件单序列信息实现

    这篇文章主要为大家介绍了Python脚本提取fasta文件单序列信息实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 15行Python代码带你轻松理解令牌桶算法

    15行Python代码带你轻松理解令牌桶算法

    这篇文章主要介绍了15行Python代码带你轻松理解令牌桶算法,需要的朋友可以参考下
    2018-03-03
  • PyCharm第一次安装及使用教程

    PyCharm第一次安装及使用教程

    本文通过图文并茂的形式给大家介绍PyCharm第一次安装及使用教程,分步骤通过实际案例给大家操作演示,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Python使用pyperclip库操作剪切板

    Python使用pyperclip库操作剪切板

    本文将介绍如何使用pyperclip库来进行剪切板操作,包括复制、粘贴文本和图片,以及清空剪切板内容等功能,具有一定的参考价值,感兴趣的 可以了解一下
    2024-03-03
  • python如何编写win程序

    python如何编写win程序

    在本篇文章里小编给大家分享的是关于python编写win程序的实例内容,有需要的朋友们可以学习下。
    2020-06-06
  • 一文带你梳理Python的中级知识

    一文带你梳理Python的中级知识

    Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。本文主要带大家梳理一下Python中常用的中级知识,希望对大家有所帮助
    2023-04-04

最新评论