Я бы посмотрел на функции Python unicode.translate () и codec.encode (). Оба из них позволили бы более элегантную обработку недопустимых символов ввода, и IIRC, translate (), как было показано, работает быстрее, чем регулярное выражение для аналогичных сценариев использования (должно быть легко найти результаты поиска в Google).
Из документов Python:
"Для объектов Unicode метод translate () не принимает необязательный аргумент deletechars. Вместо этого он возвращает копию s, в которой все символы были отображены через данную таблицу перевода, которая должна быть отображением ординалов Unicode в Порядковые числа Unicode, строки Unicode или None. Несопоставленные символы остаются нетронутыми. Символы, сопоставленные с None, удаляются. Обратите внимание, более гибкий подход заключается в создании настраиваемого кодека сопоставления символов с использованием модуля codecs (см., Например, encodings.cp1251). "
http://docs.python.org/library/stdtypes.html
http://docs.python.org/library/codecs.html