前面有位答主的答案是:
def r(str):
return r"%s"%str
打开ipython试一下,就知道对不对了。如下:
In [1]: r"%s" % "\t"
Out[1]: '\t'
In [2]: r"\t"
Out[2]: '\\t'
两次结果不一样。为什么?因为 "\t"在进入"%s"已被转义了,要想成功必须可以写成 r"%s" % r"\t",怎么感觉很奇怪。好像一不小心进入了一个死循环。
看到评论有人提议用eval,很多语言都有类似函数。我的意见是一般不要使用它,特别是当输入未知时,因为它会给你的系统带来安全隐患。
下面来具体说说怎么解决这个问题。先理解r的作用是什么,r的作用是取消字符串的自动转义。怎么理解?比如有个字符串"\n",它字符串是什么就是什么,不代表换行,而是"\"和"n"的组合出来的字符串。
实际情况是,转义默认情况下是开启的,为了取消这个功能,就有了r这个缀。要写出代替的r的函数,先要知道r对哪些字符不转义,到python官网文档可以找找,在 这里 找到了如下的说明:
根据上面的规则可以写出类似如下的函数:
trans_map = {
'\a': r'\a',
'\b': r'\b',
'\f': r'\f',
'\n': r'\n',
'\r': r'\r',
'\t': r'\t',
'\v': r'\v',
'\'': r'\'',
'\"': r'\"',
'\0': r'\0',
'\1': r'\1',
'\2': r'\2',
'\3': r'\3',
'\4': r'\4',
'\5': r'\5',
'\6': r'\6',
'\7': r'\7',
'\8': r'\8',
'\9': r'\9'
}
def raw(text):
"""Returns a raw string representation of text"""
new_str = ''
for char in text:
try:
new_str += trans_map[char]
except KeyError:
new_str += char
return new_str
使用一下:
In [6]: r'\n'
Out[6]: '\\n'
In [7]: raw('\n')
Out[7]: '\\n'
In [8]: r'\t'
Out[8]: '\\t'
In [9]: raw('\t')
Out[9]: '\\t'
差不多了,如果不需要处理进制数据就够用了,为什么这么说?因为这个函数还是有个bug:无法处理十六进制和八进制:
In [10]: r"\123"
Out[10]: '\\123'
In [11]: raw("\123")
Out[11]: 'S'
有个简单的方法,就是组织一个超长的map,类似下面:
trans_map = {
"\000": r"\000",
"\001": r"\001",
...
}
感觉很粗糙。这个问题留给你解决,记得共享给我,哈哈!