我用来跑
$s =~ s/[^[:print:]]//g;
在Perl上摆脱不可打印的字符.
在Python中没有POSIX正则表达式类,我不能写[:print:]让它意味着我想要的东西.我知道在Python中无法检测字符是否可打印.
你会怎么做?
编辑:它也必须支持Unicode字符.string.printable方式很乐意将它们从输出中剥离出来.对于任何unicode字符,curses.ascii.isprint都将返回false.
遗憾的是,迭代字符串在Python中相当慢.对于这种事情,正则表达式要快一个数量级.你只需要自己构建角色类.该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()
功能设置过滤器:
import unicodedata printable = {'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})
有关.translate()与regex&.replace()的比较,请参阅此StackOverflow帖子,删除标点符号
此函数使用列表推导和str.join,因此它以线性时间而不是O(n ^ 2)运行:
from curses.ascii import isprint def printable(input): return ''.join(char for char in input if isprint(char))