2011-08-22 63 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

相关问题