我正在使用Python处理大量CSV文件,这些文件来自外部组织,并且采用多种编码方式进行编码。我希望找到自动化方法来删除以下内容:
- 非ASCII字符
- 控制字符
- 空(ASCII 0)字符
我有一个名为“查找和替换”的产品,可以使用正则表达式,因此使用正则表达式解决上述问题的方法将非常有帮助。
谢谢
我正在使用Python处理大量CSV文件,这些文件来自外部组织,并且采用多种编码方式进行编码。我希望找到自动化方法来删除以下内容:
我有一个名为“查找和替换”的产品,可以使用正则表达式,因此使用正则表达式解决上述问题的方法将非常有帮助。
谢谢
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())
>>> cleaner('foo\0bar\rbaz\nquux\tspam eggs')
'foobar baz quux spam eggs'