Для этого может использоваться модуль unicodedata .У него есть функции для управления именами символов Unicode: name
и lookup
.
Теперь давайте посмотрим на них поближе.
name('Ż') == 'LATIN CAPITAL LETTER Z WITH DOT ABOVE'
name('ł') == 'LATIN SMALL LETTER L WITH STROKE'
lookup('LATIN CAPITAL LETTER Z') == 'Z'
lookup('LATIN SMALL LETTER L') == 'l'
Видите образец?Давайте создадим функцию, которая его использует:
import unicodedata
def normalize_char(c):
try:
cname = unicodedata.name(c)
cname = cname[:cname.index(' WITH')]
return unicodedata.lookup(cname)
except (ValueError, KeyError):
return c
normalize_char('ę') == 'e'
normalize_char('Ę') == 'E'
normalize_char('ś') == 's'
Он ищет слово WITH в имени персонажа, удаляет все, что идет после него, и возвращает его обратно в lookup
function.
Если нет ' WITH ', ValueError
повышается, и когда нет символа с таким именем, KeyError
повышается, поэтому функция возвращаетсимвол без изменений.
А вот функция, которая «переводит» строку на основе предыдущей функции:
def normalize(s):
return ''.join(normalize_char(c) for c in s)
normalize('Móżdżek') == 'Mozdzek'
Так что это решение, очевидно, очень хорошо, но я оставлю предыдущеениже.
Модуль unicodedata
также имеет функцию, которая обещает аналогичные результаты - normalize
с параметром 'NFKD'
(декомпозиция совместимости), но он пропускает большинство символов.
Если у вас есть данные символов, предоставленный вами код можно улучшить.
letters={'ł':'l', 'ą':'a', 'ń':'n', 'ć':'c', 'ó':'o', 'ę':'e', 'ś':'s', 'ź':'z', 'ż':'z'}
trans=str.maketrans(letters)
result=text.translate(trans)
Здесь хорошая таблица с символьными данными.Это JavaScript, но его можно легко использовать для Python.
И если вы не возражаете против использования внешних библиотек, вы можете попробовать Unidecode .Это было сделано только для этого.