将不是7位ASCII的字母翻译成ASCII(如ñ到n和±到a)

Mac*_*iek 8 python string ascii utf-8

我正在寻找一种快速且可能方便的方法在Python 3中将带有非ascii字母的字符串转换为仅带有ascii字母的字符.

例子!

żółw=> zolw

móżdżek=> mozdzek

łódź=>罗兹

等等...

国家字母表中有许多字母可以转换成ASCII字母(如ñ到n).我可以通过指定如何翻译每个字母来手动完成我的语言(波兰语).但有没有自动化的方法呢?或者某些图书馆会做我需要的东西?

蟒蛇str.encode()不会做,因为"?ó?w".encode('ascii', 'replace') == "???w""?ó?w".encode('ascii', 'ignore') == "w"...

我可以为波兰语字母做这样的翻译,但我不想为其他所有语言都这样做:

>>> utf8_letters = ['?','?','?','?','?','ó','?','?','?']
>>> ascii_letters = ['a','e','c','z','z','o','l','n','s']
>>> trans_dict = dict(zip(utf8_letters,ascii_letters))
>>> turtle = "?ó?w"
>>> out = []
>>> for l in turtle:
...   out.append(trans_dict[l] if l in trans_dict else l)
>>> result = ''.join(out)
>>> result
'zolw'
Run Code Online (Sandbox Code Playgroud)

上面的代码完成了我想要的波兰语字母,但它很难看:<最好的方法是什么?

当然这样的翻译会改变一些单词的含义,但那没关系.

Ole*_*pin 7

unicodedata模块可以被用于此目的.它具有操作Unicode字符名称的功能:namelookup.

现在让我们仔细看看它们.

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'
Run Code Online (Sandbox Code Playgroud)

看模式?让我们创建一个利用它的函数:

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'
Run Code Online (Sandbox Code Playgroud)

它在字符名称中查找单词WITH,删除其后的所有内容并将其反馈给该lookup函数.
如果没有' WITH ',ValueError则引发并且当没有具有此类名称的字符时,KeyError引发该函数,因此该函数返回该字符不变.

这是一个基于前一个函数"翻译"字符串的函数:

def normalize(s):
    return ''.join(normalize_char(c) for c in s)

normalize('Mó?d?ek') == 'Mozdzek'
Run Code Online (Sandbox Code Playgroud)

所以这个解决方案显然非常好,但我将在下面留下以前的解决方案.


unicodedata模块还有一个承诺类似结果的函数 - normalize'NFKD'参数(兼容性分解),但它错过了大多数字符.


如果您有字符数据,则可以改进您提供的代码.

letters={'?':'l', '?':'a', '?':'n', '?':'c', 'ó':'o', '?':'e', '?':'s', '?':'z', '?':'z'}
trans=str.maketrans(letters)
result=text.translate(trans)
Run Code Online (Sandbox Code Playgroud)

是一个包含字符数据的漂亮表格.这是JavaScript,但可以很容易地用于Python.


如果您不介意使用外部库,则可能需要尝试使用Unidecode.这是为了这个.