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

问题描述 投票:0回答:3

我想比较 2 个字符串,如果字符串相同,则有

True
,而不考虑重音符号。

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

if 'séquoia' in 'Mon sequoia est vert':
    print 'Bonjour'
python string
3个回答
13
投票

您应该使用

Unidecode
包中的 unidecode 函数:

from unidecode import unidecode

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

6
投票

你应该看看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

参考stackoverflow


6
投票

抱歉,聚会迟到了!!

不如这样做:

>>> unicodedata.normalize('NFKD', 'î ï í ī į ì').encode('ASCII', 'ignore').decode('ascii')
'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('séquoia')", setup=code)
3.6028339862823486
>>> timeit.timeit("unicodedata.normalize('NFKD', 'séquoia').encode('ASCII', 'ignore')", setup='import unicodedata')
0.7447490692138672

提示:越少越好

另外,我确信@Seur建议的包

unidecode
还有其他优点,但与不需要第三方库的本机选项相比,它仍然非常慢。

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

提示:越少越好

把它们放在一起:

clean_text = unicodedata.normalize('NFKD', 'séquoia').encode('ASCII', 'ignore').decode('ascii')
if clean_text in 'Mon sequoia est vert':
    ...
© www.soinside.com 2019 - 2024. All rights reserved.