我在 python 中处理大量的 CSV 文件。这些文件是从外部组织接收的,并使用一系列编码进行编码。我想找到一种自动化方法来删除以下内容:
- 非 ASCII 字符
- 控制字符
- 空 (ASCII 0) 字符
我有一个名为“查找并替换它!”的产品 那将使用正则表达式,因此使用正则表达式解决上述问题的方法将非常有帮助。
谢谢
您可能感兴趣的另一种选择是:
import string
clean = lambda dirty: ''.join(filter(string.printable.__contains__, dirty))
它只是从它收到的脏字符串中过滤掉所有不可打印的字符。
>>> len(clean(map(chr, range(0x110000))))
100
试试这个:
clean = re.sub('[\0\200-\377]', '', dirty)
这个想法是匹配每个 NUL 或“高 ASCII”字符(即 \0 和那些不适合 7 位的字符)并删除它们。您可以在找到它们时添加更多字符,例如 ASCII ESC 或 BEL。
或这个:
clean = re.sub('[^\040-\176]', '', dirty)
这个想法是只允许有限范围的“可打印 ASCII”,但请注意,这也会删除换行符。如果您想保留换行符或制表符等,只需将它们添加到括号中即可。
用空白替换任何不是理想字符的字符(删除它):
clean = re.sub('[^\s!-~]', '', dirty)
这允许所有空格(空格、换行符、制表符等)和所有“正常”字符(!
是第一个可打印的 ascii,~
也是十进制 128 下可打印的最后一个 ascii)。
由于这出现在 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'