比较2个字符串而不考虑Python中的重音[重复]

Posted

技术标签:

【中文标题】比较2个字符串而不考虑Python中的重音[重复]【英文标题】:Compare 2 strings without considering accents in Python [duplicate] 【发布时间】:2014-01-10 20:42:06 【问题描述】:

如果字符串相同,我想比较 2 个字符串并使用True,而不考虑重音符号。

示例:我想要以下代码来打印“Bonjour”

if 'séquoia' in 'Mon sequoia est vert':
    print 'Bonjour'

【问题讨论】:

转换为完全分解的范式,去掉重音,比较。 链接:***.com/questions/517923/… 【参考方案1】:

抱歉,派对迟到了!!

不如这样做:

>>> unicodedata.normalize('NFKD', u'î ï í ī į ì').encode('ASCII', 'ignore')
'i i i i i i'

无需遍历任何内容。 @Maxime Lorant 的回答非常低效。

>>> import timeit
>>> code = """
import string, unicodedata
def remove_accents(data):
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if x in string.ascii_letters).lower()
"""
>>> timeit.timeit("remove_accents(u'séquoia')", setup=code)
3.6028339862823486
>>> timeit.timeit("unicodedata.normalize('NFKD', u'séquoia').encode('ASCII', 'ignore')", setup='import unicodedata')
0.7447490692138672

提示:越少越好

另外,我确信unidecode@Seur 建议的包还有其他优点,但与不需要第三方库的本机选项相比,它仍然非常慢。

>>> timeit.timeit("unicodedata.normalize('NFKD', u'séquoia').encode('ASCII', 'ignore')", setup="import unicodedata")
0.7662729263305664
>>> timeit.timeit("unidecode.unidecode(u'séquoia')", setup="import unidecode")
7.489392042160034

提示:越少越好

把它们放在一起:

clean_text = unicodedata.normalize('NFKD', u'séquoia').encode('ASCII', 'ignore')
if clean_text in 'Mon sequoia est vert':
    ...

【讨论】:

【参考方案2】:

你应该使用Unidecode包中的unidecode函数:

from unidecode import unidecode

if unidecode(u'séquoia') in 'Mon sequoia est vert':
    print 'Bonjour'

【讨论】:

【参考方案3】:

你应该看看Unidecode。使用模块和这个方法,你可以得到一个没有重音的字符串,然后进行比较:

def remove_accents(data):
    return ''.join(x for x in unicodedata.normalize('NFKD', data) if x in string.ascii_letters).lower()


if remove_accents('séquoia') in 'Mon sequoia est vert':
    # Do something
    pass

Reference from ***

【讨论】:

如果单词是“séQuoIa”,这将不起作用,因为remove_accents 方法将所有字符都变成小写。

以上是关于比较2个字符串而不考虑Python中的重音[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有重音符号的Python转储json [重复]

无法使用php读取数组中的重音名称[重复]

如何解释 Python 中正则表达式的重音字符?

字符串

如何重新格式化字符串以不包括 Python 中的重音字母? [复制]

如何在熊猫数据框中对字符串进行排序或检查等效性而不考虑顺序?