Desafortunadamente, la iteración sobre cadenas es bastante lenta en Python. Las expresiones regulares son más rápidas en un orden de magnitud para este tipo de cosas. Solo tienes que construir la clase de personaje tú mismo. El módulo unicodedata es bastante útil para esto, especialmente la función unicodedata.category () . Consulte Base de datos de caracteres Unicode para obtener descripciones de las categorías.
import unicodedata, re, itertools, sys
all_chars = (chr(i) for i in range(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
control_chars = ''.join(map(chr, itertools.chain(range(0x00,0x20), range(0x7f,0xa0))))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
Para Python2
import unicodedata, re, sys
all_chars = (unichr(i) for i in xrange(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
control_chars = ''.join(map(unichr, range(0x00,0x20) + range(0x7f,0xa0)))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
Para algunos casos de uso, pueden ser preferibles categorías adicionales (por ejemplo, todos los del grupo de control , aunque esto podría ralentizar el tiempo de procesamiento y aumentar el uso de la memoria de manera significativa. Número de caracteres por categoría:
Cc
(control): 65
Cf
(formato): 161
Cs
(sustituto): 2048
Co
(uso privado): 137468
Cn
(no asignado): 836601
Editar Agregar sugerencias de los comentarios.