删除Python unicode字符串中的重音符号的最佳方法是什么?
我在Python中有一个Unicode字符串,我想删除所有的重音符(变音符号)。
我在网上找到了一个在Java中做到这一点的优雅方法:
我是否需要安装一个库,比如pyICU,或者只用python标准库就可以吗? 那么python 3呢?
重要说明:我想避免使用从重音字符到非重音对象的显式映射的代码。
Unidecode是这个的正确答案。 它将任何unicode字符串音译为ascii文本中最接近的可能表示形式。
例:
accented_string = u'Málaga'
# accented_string is of type 'unicode'
import unidecode
unaccented_string = unidecode.unidecode(accented_string)
# unaccented_string contains 'Malaga'and is of type 'str'
这个怎么样:
import unicodedata
def strip_accents(s):
return ''.join(c for c in unicodedata.normalize('NFD', s)
if unicodedata.category(c) != 'Mn')
这也适用于希腊字母:
>>> strip_accents(u"A u00c0 u0394 u038E")
u'A A u0394 u03a5'
>>>
字符类别“Mn”代表Nonspacing_Mark
,类似于MiniQuark答案中的unicodedata.combining(我没有想到unicodedata.combining,但它可能是更好的解决方案,因为它更明确)。
请记住,这些操作可能会显着改变文本的含义。 口音,变音等不是“装饰”。
我刚刚在网上找到了这个答案:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
only_ascii = nfkd_form.encode('ASCII', 'ignore')
return only_ascii
它工作正常(例如法语),但我认为第二步(删除重音符号)可以比删除非ASCII字符更好地处理,因为某些语言(例如希腊语)会失败。 最好的解决方案可能是明确删除被标记为变音符的unicode字符。
编辑 :这是诀窍:
import unicodedata
def remove_accents(input_str):
nfkd_form = unicodedata.normalize('NFKD', input_str)
return u"".join([c for c in nfkd_form if not unicodedata.combining(c)])
unicodedata.combining(c)
将返回true,如果字符c
可以与前面的字符组合,那主要是它是一个变音符号。
编辑2 : remove_accents
需要一个unicode字符串,而不是一个字节字符串。 如果你有一个字节字符串,那么你必须把它解码为一个unicode字符串,如下所示:
encoding = "utf-8" # or iso-8859-15, or cp1252, or whatever encoding you use
byte_string = b"café" # or simply "café" before python 3.
unicode_string = byte_string.decode(encoding)
链接地址: http://www.djcxy.com/p/9399.html
上一篇: What is the best way to remove accents in a Python unicode string?