前两天处理字符串的时候,因为需要做一些字符转义,比如说要把原字符串中所有的单引号前面加个反斜杠,给反斜杠前面再加个反斜杠啥的。一开始想着是这么写:
s.replace("'", "\\'").replace("\\", "\\\\")
后来觉得反斜杠太多了,实在不太美观,就想着能不能用raw string来代替:
s.replace(r"'", r"\'").replace(r"\", r"\\")
但是这个是会报错的,而且还是语法错误,SyntaxError: unexpected character after line continuation character。
后来翻了一下文档,发现raw string并不像我想当然的一样,会原封不动地展现字符串原始的模样(或许是因为名字具有误导性)。事实上,raw string仍然会进行转义。有一句话概括得很好:
When an ‘r’ or ‘R’ prefix is present, a character following a backslash is included in the string without change, and all backslashes are left in the string.
简单翻译一下就是,raw string的行为是保留所有的反斜杠和反斜杠后面一个字符。这也就是说,raw string与普通字符串的区别在于会保留全部反斜杠(普通字符串会因为转义而丢掉一部分反斜杠)。
这里为什么报错,因为反斜杠后面一个字符(也就是代表字符串结束的引号)也被保留并视作字符串的一部分了。事实上,如果不加r前缀,只有一个反斜杠的普通字符串也是会报错的。
说了一堆废话,只是想说明,raw string并不是字符串处理时的“银弹”,还是要考虑一些特殊情况。