2011-11-13 30 views
7

我想從字符串列表中刪除所有類型的轉義序列。我怎樣才能做到這一點? 輸入:如何從字符串列表中刪除所有轉義序列?

['william', 'short', '\x80', 'twitter', '\xaa', '\xe2', 'video', 'guy', 'ray'] 

輸出:

['william', 'short', 'twitter', 'video', 'guy', 'ray'] 

http://docs.python.org/reference/lexical_analysis.html#string-literals

+1

最終的字符串對象不承載任何有關其被包含轉義序列的字符串文字的信息。如果你甚至不知道有沒有,你會如何「移除」它們? –

回答

8

像這樣的事情?

>>> from ast import literal_eval 
>>> s = r'Hello,\nworld!' 
>>> print(literal_eval("'%s'" % s)) 
Hello, 
world! 

編輯:OK,這不是你想要的。你想要的東西一般不能完成,因爲@Sven Marnach解釋過,字符串實際上並不包含轉義序列。這些只是字符串文字中的符號。

你可以從你的列表進行過濾,以非ASCII字符的所有字符串與

def is_ascii(s): 
    try: 
     s.decode('ascii') 
     return True 
    except UnicodeDecodeError: 
     return False 

[s for s in ['william', 'short', '\x80', 'twitter', '\xaa', 
      '\xe2', 'video', 'guy', 'ray'] 
if is_ascii(s)] 
3

你可以過濾掉「字」不是字母數字,用列表的理解和str.isalnum()

>>> l = ['william', 'short', '\x80', 'twitter', '\xaa', '\xe2', 'video', 'guy', 'ray'] 
>>> [word for word in l if word.isalnum()] 
['william', 'short', 'twitter', 'video', 'guy', 'ray'] 

如果您想過濾掉數字,請使用str.isalpha()代替:

>>> l = ['william', 'short', '\x80', 'twitter', '\xaa', '\xe2', 'video', 'guy', 'ray', '456'] 
>>> [word for word in l if word.isalpha()] 
['william', 'short', 'twitter', 'video', 'guy', 'ray'] 
+1

對於許多應用程序來說,這是一個很好的答案,但應該指出的是,其他非字母數字字符(如空格)也會受到攻擊。 –

2

這是無法完成的,至少在你要求的廣泛範圍內。正如其他人所提到的那樣,運行時python不知道具有轉義序列的東西與沒有轉義序列的東西之間的區別。

實施例:

print ('\x61' == 'a') 

打印True。所以沒有辦法找到這兩個字符串之間的區別,除非您嘗試對您的python腳本進行一些靜態分析。

20

如果你想去掉一些你不喜歡的字符,你可以使用translate功能剝離出來:

>>> s="\x01\x02\x10\x13\x20\x21hello world" 
>>> print(s) 
!hello world 
>>> s 
'\x01\x02\x10\x13 !hello world' 
>>> escapes = ''.join([chr(char) for char in range(1, 32)]) 
>>> t = s.translate(None, escapes) 
>>> t 
' !hello world' 

這將去掉所有這些控制字符:

001 1  01 SOH (start of heading) 
    002 2  02 STX (start of text) 
    003 3  03 ETX (end of text) 
    004 4  04 EOT (end of transmission) 
    005 5  05 ENQ (enquiry) 
    006 6  06 ACK (acknowledge) 
    007 7  07 BEL '\a' (bell) 
    010 8  08 BS '\b' (backspace) 
    011 9  09 HT '\t' (horizontal tab) 
    012 10 0A LF '\n' (new line) 
    013 11 0B VT '\v' (vertical tab) 
    014 12 0C FF '\f' (form feed) 
    015 13 0D CR '\r' (carriage ret) 
    016 14 0E SO (shift out) 
    017 15 0F SI (shift in) 
    020 16 10 DLE (data link escape) 
    021 17 11 DC1 (device control 1) 
    022 18 12 DC2 (device control 2) 
    023 19 13 DC3 (device control 3) 
    024 20 14 DC4 (device control 4) 
    025 21 15 NAK (negative ack.) 
    026 22 16 SYN (synchronous idle) 
    027 23 17 ETB (end of trans. blk) 
    030 24 18 CAN (cancel) 
    031 25 19 EM (end of medium) 
    032 26 1A SUB (substitute) 
    033 27 1B ESC (escape) 
    034 28 1C FS (file separator) 
    035 29 1D GS (group separator) 
    036 30 1E RS (record separator) 
    037 31 1F US (unit separator) 
+0

對不起,這個循環只是讓我畏縮。 'escapes =''.join([字符(字符)的字符範圍內(1,32)])''s.translate(無,轉義)' – Rebs

+0

@AdamGriffiths,這是一個很好的變化。謝謝。 – sarnold

+0

我喜歡這個答案,而不是第一個答案。它運作良好,非常靈活。 – weefwefwqg3

0

我有類似的問題,同時從十六進制轉換爲字符串。這是最後在python 中的工作示例

list_l = ['william', 'short', '\x80', 'twitter', '\xaa', '\xe2', 'video', 'guy', 'ray'] 
decode_data=[] 
for l in list_l: 
    data =l.decode('ascii', 'ignore') 
    if data != "": 
     decode_data.append(data) 

# output :[u'william', u'short', u'twitter', u'video', u'guy', u'ray'] 
相關問題