2017-05-31 54 views
0

假設我有一個程序接收我無法真正控制的輸入。以下變量作爲IS(我們不能改變這裏的輸入)餵養:將帶有轉義序列的字符串轉換爲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' 

S olve爲答案()

編輯:「\」,在[204]例如,不是「\」

+0

'」 \''不能實現,因爲'\''總是一個轉義前綴,我相信你正在尋找''\\''。 – Uriel

+2

告訴我們你如何接受這個輸入。最合理的輸入方式首先不適用於轉義序列解釋。 – user2357112

+0

'b [2]',至少,*是*單個反斜槓。您將索引的返回值與值的字符串表示混淆在一起。 – chepner

回答

3

你必須使用encodedecode

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

可以使用repr轉換該字符串轉換爲它們的表示,然後剝去'"並採取焦炭:

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

answer對於這個問題,看起來像

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

對於以引號開頭或結尾的字符串,例如'「foo」':'answer(''foo'')' - >'foo'而不是'「foo」',這會產生不正確的輸出。你可以做'repr(a)[1:-1]'。 –

0

如果我明白你的問題,你應該將字符串轉換成使用repr原來的表示,則使用str.partition()這樣的例子:

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

("'C:", '\\', "temp'") 
相關問題