10

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

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

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

谢谢

4

4 回答 4

8

您可能感兴趣的另一种选择是:

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

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

>>> len(clean(map(chr, range(0x110000))))
100
于 2013-09-25T13:39:26.910 回答
6

试试这个:

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

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

或这个:

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

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

于 2013-09-25T12:05:56.237 回答
2

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

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

这允许所有空格(空格、换行符、制表符等)和所有“正常”字符(!是第一个可打印的 ascii,~也是十进制 128 下可打印的最后一个 ascii)。

于 2013-09-25T14:57:17.897 回答
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())

正则表达式执行类似 HTML 的空格折叠(即,它将 Unicode 定义的任意范围的空格转换为单个空格),然后 lambda 去除除空格之外的任何字符,这些字符被 Unicode 分类为“分隔符”或“其他”。

然后你会得到这样的结果:

>>> cleaner('foo\0bar\rbaz\nquux\tspam eggs')
'foobar baz quux spam eggs'
于 2020-04-27T04:23:45.337 回答