从文本文件中删除不可打印的“gremlin”字符

时间:2013-09-25 11:48:21

标签: python regex encoding

我正在python中处理大量的CSV文件。这些文件是从外部组织接收的,并使用一系列编码进行编码。我想找到一种自动方法来删除以下内容:

  • 非ASCII字符
  • 控制字符
  • Null(ASCII 0)字符

我有一个名为'查找并替换它'的产品!这将使用正则表达式,因此使用正则表达式解决上述问题的方法将非常有用。

谢谢

4 个答案:

答案 0 :(得分:6)

您可能感兴趣的替代方案是:

import string
clean = lambda dirty: ''.join(filter(string.printable.__contains__, dirty))

它只是从它收到的脏字符串中过滤掉所有不可打印的字符。

>>> len(clean(map(chr, range(0x110000))))
100

答案 1 :(得分:5)

试试这个:

clean = re.sub('[\0\200-\377]', '', dirty)

这个想法是匹配每个NUL或“高ASCII”字符(即\ 0和那些不适合7位的字符)并删除它们。您可以在找到它们时添加更多字符,例如ASCII ESC或BEL。

或者这个:

clean = re.sub('[^\040-\176]', '', dirty)

这个想法只允许有限范围的“可打印ASCII”,但请注意,这也会删除换行符。如果您想保留换行符或标签符号等,只需将它们添加到括号中即可。

答案 2 :(得分:2)

用空白替换任何不理想的字符(删除它):

clean = re.sub('[^\s!-~]', '', dirty)

这允许所有空格(空格,换行符,制表符等)和所有“普通”字符(!是第一个ascii可打印,~是最后一个ascii可打印在十进制128下。)< / p>

答案 3 :(得分:0)

由于这已在Google上显示,并且我们不再针对Python 2.x,因此我可能应该提到字符串上的isprintable方法。

这不是完美的,因为它认为空格是可打印的,而换行符和制表符却是不可打印的,但是我可能会做这样的事情:

whitespace_normalizer = re.compile('\s+', re.UNICODE)
cleaner = lambda instr: ''.join(x for x in whitespace_normalizer.sub(' ', instr) if x.isprintable())

regex进行类似HTML的空格折叠(即,将Unicode定义的空白范围转换为单个空格),然后lambda剥离除Unicode分类为“ Separator”或“ Other”的空格以外的所有字符。

然后您将得到如下结果:

>>> cleaner('foo\0bar\rbaz\nquux\tspam eggs')
'foobar baz quux spam eggs'