2011-08-22 117 views
5

有時我有一個奇怪的字符串。它們在瀏覽器中不可見,但是是字符串的一部分,並以len()計算。 我該如何擺脫它? Strip()刪除正常空間,但不是那個標誌。Python - 如何從字符串中刪除隱藏的標誌?

+0

看到這個解決方案:http://stackoverflow.com/questions/92438/stripping-non-printable-characters-from-a-string-in-python –

回答

2

要啓用並刪除其餘的像這樣

import re 
text = re.sub("[^a-z0-9]+","", text, flags=re.IGNORECASE)

它會刪除比其他任何字符到z,A到Z的字符,收集一套0到9

+0

我需要完整的utf8標誌集:/ – robos85

+0

@ robos85,你需要一些信息去除或不去除。所以我可以假設你需要去除utf8的所有無效字符?有一個解決方案,但可能包括不可見/不可打印的字符。 – YOU

11

使用來自string模塊的字符類別。此外

new_string = re.sub("[^{}]+".format(printable), "", the_string) 

,如果你想看到所有的字符:如果你想允許所有可打印字符,你可以在你的答案做

from string import printable 
new_string = ''.join(char for char in the_string if char in printable) 

大廈,您可以用re.sub就此別過一個字符串,即使是那些不可打印,你總是可以做

print repr(the_string) 

,它會顯示之類的東西\x00爲不可打印的字符。

+0

當然這是正確的答案。 – dotancohen

+0

秒鐘的答案像魅力一樣工作,謝謝。 – Yehonatan

1

對於各種字符串分析,正則表達式是一種很好且非常通用的工具。如果速度有問題,字符串類中的「translate」方法也可以幫助你。

首先定義一個(「身份」)的映射,它不會改變任何東西:如果你想替換每個「一」由「B」,您修改映射

mapping = map(chr, range(256)) 

mapping[ord('a')] = 'b' 

現在你建表的 「翻譯」 方法:

table = "".join(mapping) 

print "abc".translate(table) 

打印「bbc」。

如果你真的要刪除的「一」,你不修改上述映射,建立表,然後調用 翻譯如下:

print "abc".translate(table, "a") 

爲您提供了「BC」。

建表之後,翻譯方法非常快。

所以你的情況,你可以修改映射,使得所有多餘的字符映射到一個空白

mapping = map(chr, range(256)) 
table = "".join(" " if c in unwanted_chars else c for c in map(chr, range(256))) 

,並使用len("my string".translate(table).trim())而忽略在一開始不想要的字符 和字符串的結尾。

或者您使用len("my string".translate(table, unwanted_chars))這將忽略所有不需要的字符。

+0

不錯。當我再次投票時明天+1。我想過翻譯,但懶得查找語法。 – agf