python字符串取消转义_python取消转义,除了r还有什么?可以调用函数取消转义吗?...

前面有位答主的答案是:

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",

...

}

感觉很粗糙。这个问题留给你解决,记得共享给我,哈哈!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值