Das Iterieren über Strings ist in Python leider eher langsam. Reguläre Ausdrücke sind für solche Dinge um eine Größenordnung schneller. Sie müssen nur die Charakterklasse selbst erstellen. Das Unicodedata- Modul ist hierfür sehr hilfreich, insbesondere die Funktion unicodedata.category () . Beschreibungen der Kategorien finden Sie unter Unicode-Zeichendatenbank .
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)
Für 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)
In einigen Anwendungsfällen sind möglicherweise zusätzliche Kategorien (z. B. alle aus der Kontrollgruppe) vorzuziehen, obwohl dies die Verarbeitungszeit verlangsamen und die Speichernutzung erheblich erhöhen kann. Anzahl der Zeichen pro Kategorie:
Cc
(Kontrolle): 65
Cf
(Format): 161
Cs
(Ersatz): 2048
Co
(für den privaten Gebrauch): 137468
Cn
(nicht zugewiesen): 836601
Bearbeiten Hinzufügen von Vorschlägen aus den Kommentaren.