Способ решения этой проблемы заключается в принятии решения о том, какие символы разрешены (разные системы имеют разные правила для допустимых идентификаторов.
После того, как вы решите, какие символы разрешены, напишите разрешено() предикат и подкласс dict для использования с str.translate :
def makesafe(text, allowed, substitute=None):
''' Remove unallowed characters from text.
If *substitute* is defined, then replace
the character with the given substitute.
'''
class D(dict):
def __getitem__(self, key):
return key if allowed(chr(key)) else substitute
return text.translate(D())
Эта функция очень гибкая. Она позволяет легко задавать правиладля принятия решения, какой текст сохранить, а какой текст заменить или удалить.
Вот простой пример, использующий правило «разрешать только символы из категории Unicode L»:
import unicodedata
def allowed(character):
return unicodedata.category(character).startswith('L')
print(makesafe('the*ides&of*march', allowed, '_'))
print(makesafe('the*ides&of*march', allowed))
Этот код производит безопасный вывод следующим образом:
the_ides_of_march
theidesofmarch