将带有转义序列的字符串转换为python中的原始字符表示形式

时间:2017-05-31 20:54:59

标签: python

假设我有一个接收我无法控制的输入的程序。以下变量按原样输入(我们不能在此处更改输入):

a = "C:\temp"
b = "C:\games"
c = "Hello World"
d = "\t"

不幸的是,Python会误解事物并放入转义序列:

In [138]: a[2]
Out[138]: '\t'

In [139]: b[2]
Out[139]: '\\'

In [140]: d[0]
Out[140]: '\t'

让我们假设答案已经找到。它应该执行以下操作:

def answer(x):
    pass #TODO: your code goes here

期望的产出:

In [200]: answer(a)[2]
Out [201]: '\\'

In [202]: answer(a)[3]
Out [203]: 't'

In [204]: answer(b)[2]
Out [205]: '\\'

In [206]: answer(b)[3]
Out [207]: 'g'

In [208]: answer(c)
Out [209]: 'Hello World'

我已经尝试过使用ast模块并使用解码,但无济于事:

In [144]: import ast

In [145]: ast.literal_eval(a)
  File "<unknown>", line 1
    C:  emp
     ^
SyntaxError: invalid syntax

或者使用解码:

In [147]: a.decode('string-escape')[2]
Out[147]: '\t'

解决答案()

编辑:&#34; \&#34;,not&#34; \&#34;在[204]例子中

3 个答案:

答案 0 :(得分:3)

您必须使用encode而不是decode

>>> "\t".encode('string-escape')
'\\t'

答案 1 :(得分:1)

您可以使用repr将此字符串转换为其表示形式,然后剥离'"并获取字符:

>>> a = 'C:\temp'
>>> a[2]
'\t'
>>> repr(a).strip('\'"')[2]
'\\'

answer就此而言,看起来像是

def answer(x): return repr(x).strip('\'"')

答案 2 :(得分:0)

如果我理解您的问题,您应该使用repr将字符串转换为原始字词,然后像这样使用str.partition()

>>> a = 'C:\temp'
>>> repr(a).partition('\\')

("'C:", '\\', "temp'")