L'iterazione delle stringhe è purtroppo piuttosto lenta in Python. Le espressioni regolari sono più veloci di un ordine di grandezza per questo genere di cose. Devi solo costruire la classe del personaggio da solo. Il modulo unicodedata è molto utile per questo, specialmente la funzione unicodedata.category () . Vedere Database dei caratteri Unicode per le descrizioni delle categorie.
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)
# or equivalently and much more efficiently
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)
Per 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)
# or equivalently and much more efficiently
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)
Per alcuni casi d'uso, potrebbero essere preferibili categorie aggiuntive (ad es. Tutte dal gruppo di controllo , sebbene ciò potrebbe rallentare il tempo di elaborazione e aumentare notevolmente l'utilizzo della memoria. Numero di caratteri per categoria:
Cc
(controllo): 65
Cf
(formato): 161
Cs
(surrogato): 2048
Co
(uso privato): 137468
Cn
(non assegnato): 836601
Modifica Aggiunta di suggerimenti dai commenti.