К сожалению, перебор строк в 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
Редактировать Добавление предложений из комментариев.