从python中的string中剥离不可打印的字符

我用来运行

$s =~ s/[^[:print:]]//g; 

在Perl上摆脱不可打印的字符。

在Python中,没有POSIX正则expression式类,我不能写[:print:]这意味着我想要什么。 我知道在Python中没有办法检测一个字符是否可打印。

你会怎么做?

编辑:它也必须支持Unicode字符。 string.printable方法将会愉快地将它们从输出中剥离出来。 curses.ascii.isprint将为任何Unicode字符返回false。

迭代string不幸的是在Python中很慢。 正则expression式对于这种事情的速度要快一个数量级。 你只需要自己build立angular色类。 unicodedata模块对此非常有用,特别是unicodedata.category()函数。 请参阅Unicode字符数据库以获取类别的描述。

 import unicodedata, re all_chars = (unichr(i) for i in xrange(0x110000)) control_chars = ''.join(c for c in all_chars if unicodedata.category(c) == 'Cc') # or equivalently and much more efficiently control_chars = ''.join(map(unichr, range(0,32) + range(127,160))) control_char_re = re.compile('[%s]' % re.escape(control_chars)) def remove_control_chars(s): return control_char_re.sub('', s) 

据我所知,最pythonic /高效率的方法是:

 import string filtered_string = filter(lambda x: x in string.printable, myStr) 

您可以尝试使用unicodedata.category()函数设置filter:

 printable = Set('Lu', 'Ll', ...) def filter_non_printable(str): return ''.join(c for c in str if unicodedata.category(c) in printable) 

请参阅可用类别的Unicode数据库字符属性

在Python 3中,

 def filter_nonprintable(text): import string # Get the difference of all ASCII characters from the set of printable characters nonprintable = set([chr(i) for i in range(128)]).difference(string.printable) # Use translate to remove all non-printable characters return text.translate({ord(character):None for character in nonprintable}) 

看到这个StackOverflow后删除标点符号如何.translate()比较正则expression式和.replace()

这个函数使用list comprehensions和str.join,所以它运行在线性时间而不是O(n ^ 2):

 from curses.ascii import isprint def printable(input): return ''.join(char for char in input if isprint(char)) 

我现在想到的最好的(感谢上面的python-izers)

 def filter_non_printable(str): return ''.join([c for c in str if ord(c) > 31 or ord(c) == 9]) 

这是我发现与Unicode字符/string一起工作的唯一方法

有更好的select吗?

要删除“空白”,

 import re t = """ \n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p>&nbsp;</p>\n\t<p> """ pat = re.compile(r'[\t\n]') print(pat.sub("", t)) 
    Interesting Posts