先说一个比较囧的事情:在写虾米音乐试听下载器的时候遇到一个问题,因为保存的文件都是用音乐的标题命名的,所以碰到一些诸如「対峙/out border」等含有非法字符(哼哼,说的就是你 →_→ Windows)的标题的时候,就会保存失败。于是我想起了迅雷的解决方法:把所有的非法字符替换成下划线。
于是就引入了正则表达式的使用。一番搜索囫囵吞枣后,我写下了这样的函数:
[url=https://github.com/timothyqiu/xiami-downloader/commit/18817b0646e5e81fd75a9b55ec3a94e8e1f2dd1f]意识到了[/url]这个函数里的好多问题:
[list]
[*]Python 和 Shell 不同,无论单引号还是双引号,反斜杠都是转义符。走狗屎运的是,Python 对于没意义的转义 [code]\/[/code] 的处理是保持原样。[/*]
[*]即便如此,[code]sanitize_filename('\\/:*?<>|')[/code] 依旧返回 [code]\_______[/code] 而不是全部都是下划线。[/*]
[/list]
于是感觉得正正经经看看文档了。
[b]Raw strings[/b]
看了文档后才意识到,Python 正则表达式模块的转义是独立的。例如匹配一个反斜杠字符需要将参数写成:'\\\\':
Python 将字符串转义:\\\\ 被转义为 \\
re 模块获得传入的 \\ 将其解释为正则表达式,按照正则表达式的转义规则将其转义为 \
如此麻烦的前提下,Raw String 就大有作为了,顾名思义就是(除了结尾的反斜杠)不会被转义的字符串。于是匹配一个反斜杠字符就可以写作 r'\\'。
所以上面的 sanitize_filename 改成了:
[url=http://docs.python.org/2/library/re.html]http://docs.python.org/2/library/re.html[/url]
[/list]