我正在寻找一种快速和可能方便的方式在Python3翻译字符串与非ascii字母的单词只有ascii字母。
示例!
使用=> zolw的żół
móżdżek => mozdzek
=>łódź罗兹
以此类推。
在国家字母表中,有许多字母可以转换为ASCII字母(如ńto 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'上面的代码做了我想要的波兰字母,但它是丑陋的:<什么是最好的方法来做到这一点?
当然,这样的翻译会改变一些单词的意思,但这没关系。
发布于 2012-01-20 08:05:03
模块可以用于此目的。它具有操作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模块也有一个函数,可以保证类似的结果-带有'NFKD'参数的normalize (兼容性分解),但它遗漏了大多数字符。
如果您有字符数据,则可以改进您提供的代码。
letters={'ł':'l', 'ą':'a', 'ń':'n', 'ć':'c', 'ó':'o', 'ę':'e', 'ś':'s', 'ź':'z', 'ż':'z'}
trans=str.maketrans(letters)
result=text.translate(trans)是一个包含字符数据的很好的表。这是JavaScript,但是可以很容易地在Python中使用。
如果您不介意使用外部库,那么您可能想尝试一下。它就是为这个而生的。
https://stackoverflow.com/questions/8935111
复制相似问题