Ваш класс персонажа (как показано в трассировке) недействителен;}
следует после =
по порядковому значению (}
равно 125, =
равно 61), а -
между ними означает, что он пытается сопоставить любой символ от порядкового номера }
до =
и между.Поскольку диапазоны символов должны переходить от низкого порядкового номера к верхнему порядковому, 125-> 61 бессмысленна, поэтому ошибка.
В некотором смысле вам повезло;если бы символы вокруг -
были поменяны местами, например, =-}
, вы бы молча удалили все символы с порядкового номера от 61 до 125 включительно, который включал бы, наряду с кучей знаков препинания, все стандартные буквы ASCII, обастрочные и прописные буквы.
Это можно исправить, просто удалив второй -
в своем классе персонажей (вы уже включили его в начало класса, где его не нужно экранировать), изменив
text = re.sub(r"[-()\"#/@;:<>{}-=~|.?,]", "", text)
до
text = re.sub(r"[-()\"#/@;:<>{}=~|.?,]", "", text)
но я собираюсь предложить отбросить здесь регулярные выражения;риск ошибок с большим количеством буквенных знаков препинания высок, и есть другие методы, которые вообще не включают регулярные выражения, которые должны работать просто отлично и не заставлять вас беспокоиться, если вы избежали всех важных вещей (альтернатива - избыточный выход,что делает регулярное выражение нечитаемым и подверженным ошибкам).
Вместо этого замените эту строку на простым str.translate
вызовом .Прежде всего, вне функции, создайте таблицу перевода вещей, которые нужно удалить :
# The redundant - is harmless here since the result is a dict which dedupes anyway
killpunctuation = str.maketrans('', '', r"-()\"#/@;:<>{}-=~|.?,")
, затем замените строку:
text = re.sub(r"[-()\"#/@;:<>{}-=~|.?,]","",text)
на:
text = text.translate(killpunctuation)
Он должен работать по крайней мере так же быстро, как и регулярное выражение (скорее всего, быстрее), и он гораздо менее подвержен ошибкам, поскольку ни один символ не имеет специального значения (таблицы перевода - это просто отображения из ординалов Unicode в None
,означает удаление, другой порядковый номер, означающий замену одного символа, или строку, означающую замену char -> multichar; у них нет понятия специальных переходов).Если целью является уничтожение всех знаков препинания ASCII, вам, вероятно, лучше использовать константу модуля string
для определения таблицы перевода (что также делает код более самодокументируемым, поэтому люди не задаются вопросом, удаляете ли вы все илипросто некоторая пунктуация, и была ли она преднамеренной):
import string
killpunctuation = str.maketrans('', '', string.punctuation)
Как это бывает, ваша существующая строка не удаляет все знаки пунктуации (она пропускает, среди прочего, ^
, !
, $
и т. д.), поэтому это изменение может быть неверным, но если оно правильное, обязательно внесите его.Если это должна быть часть знаков препинания, вы определенно хотите добавить комментарий о том, как была выбрана эта пунктуация, поэтому сопровождающие не задаются вопросом, допустили ли вы ошибку.