Iterowanie po łańcuchach jest niestety raczej powolne w Pythonie. Wyrażenia regularne są o rząd wielkości szybsze w tego rodzaju sytuacjach. Musisz tylko sam zbudować klasę postaci. Unicodedata moduł jest bardzo pomocne w tym, w szczególności unicodedata.category () funkcja. Aby zapoznać się z opisami kategorii, zobacz Baza danych znaków Unicode .
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)
W przypadku 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)
W niektórych przypadkach preferowane mogą być dodatkowe kategorie (np. Wszystkie z grupy kontrolnej , chociaż może to spowolnić czas przetwarzania i znacznie zwiększyć użycie pamięci. Liczba znaków na kategorię:
Cc
(kontrola): 65
Cf
(format): 161
Cs
(surogat): 2048
Co
(do użytku prywatnego): 137468
Cn
(nieprzypisane): 836601
Edytuj Dodawanie sugestii z komentarzy.