2011-11-13 40 views
7

Tôi muốn xóa tất cả các loại trình tự thoát khỏi danh sách các chuỗi. Tôi có thể làm cái này như thế nào? đầu vào:Làm thế nào để loại bỏ tất cả các chuỗi thoát khỏi danh sách các chuỗi?

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

đầu ra:

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

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

+1

Đối tượng chuỗi cuối cùng không mang bất kỳ thông tin nào về thời tiết chuỗi ký tự bị xáo trộn nó chứa chuỗi thoát. Nếu bạn thậm chí không thể biết nếu có bất kỳ, làm thế nào bạn sẽ "loại bỏ" chúng? –

Trả lời

8

Something như thế này?

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

Sửa: ok, đó không phải là những gì bạn muốn. Những gì bạn muốn không thể được thực hiện nói chung, bởi vì, như @Sven Marnach giải thích, các chuỗi không thực sự chứa các chuỗi thoát. Đó chỉ là ký hiệu trong chuỗi ký tự.

Bạn có thể lọc tất cả các chuỗi với ký tự ASCII từ danh sách của bạn với

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

Bạn có thể lọc ra "chữ" mà không phải là chữ và số sử dụng một sự hiểu biết danh sách và 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'] 

Nếu bạn cũng muốn lọc số, hãy sử dụng str.isalpha() thay thế:

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

Đây là câu trả lời hay cho nhiều ứng dụng, mặc dù cần lưu ý rằng các ký tự không phải chữ và số khác như khoảng trắng cũng sẽ bị rìu. –

2

Điều này không thể thực hiện được, ít nhất là ở phạm vi rộng mà bạn đang yêu cầu. Như những người khác đã đề cập, thời gian chạy python không biết sự khác biệt giữa một cái gì đó với trình tự thoát, và một cái gì đó mà không có.

Ví dụ:

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

in True. Vì vậy, không có cách nào để tìm sự khác biệt giữa hai chuỗi này, trừ khi bạn thử một số phân tích tĩnh của tập lệnh python của bạn.

20

Nếu bạn muốn loại bỏ một số ký tự mà bạn không thích, bạn có thể sử dụng chức năng translate dải chúng ra:

>>> 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' 

Điều này sẽ loại bỏ tất cả các ký tự điều khiển:

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

Xin lỗi, vòng lặp đó chỉ khiến tôi rạn nứt. 'escapes = '' .join ([chr (char) cho char trong phạm vi (1, 32)])' 's.translate (Không có, thoát)' – Rebs

+0

@AdamGriffiths, đó là một thay đổi tốt đẹp. Cảm ơn. – sarnold

+0

Tôi thích câu trả lời này hơn là câu trả lời đầu tiên. nó hoạt động tốt và rất linh hoạt. – weefwefwqg3

0

Tôi có vấn đề tương tự khi chuyển đổi từ hệ thập lục phân thành Chuỗi. Đây là những gì cuối cùng đã làm việc trong python Ví dụ

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'] 
Các vấn đề liên quan