На жаль, ітерація рядків у Python відбувається досить повільно. Регулярні вирази для цього типу на порядок швидші. Вам просто потрібно побудувати клас персонажів самостійно. Для цього дуже корисний модуль unicodedata , особливо функція unicodedata.category () . Див бази даних символів 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)
Для 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)
У деяких випадках використання додаткові категорії (наприклад, усі з контрольної групи можуть бути кращими, хоча це може сповільнити час обробки та значно збільшити використання пам'яті. Кількість символів у категорії:
Cc
(контроль): 65
Cf
(формат): 161
Cs
(сурогат): 2048
Co
(приватне використання): 137468
Cn
(без призначення): 836601
Редагувати Додавання пропозицій із коментарів.