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

例子!

żółw=> zolw

móżdek=> mozdzek

łódź=>罗兹

等等...

国家字母表中有许多字母可以转换为ASCII字母(如ń到n)。通过指定如何翻译每个字母,我可以针对我的语言(波兰语)手动进行操作。但是,有什么自动化的方法可以做到这一点吗?还是一些图书馆可以满足我的需求?

Python的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'

上面的代码符合波兰字母的要求,但是很难看:
当然,这样的翻译会改变某些单词的含义,但是没关系。

最佳答案

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 函数。
如果不存在“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)
Here是一个包含字符数据的漂亮表。这是JavaScript,但可以轻松用于Python。

而且,如果您不介意使用外部库,则可能需要尝试Unidecode。它就是为此而制作的。

关于python - 将非7位ASCII的字母转换为ASCII(例如ń转换为n,±转换为±),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8935111/

10-11 03:03
查看更多