我想比较 2 个字符串,如果字符串相同,则有
True
,而不考虑重音符号。
示例:我想要以下代码来打印“Bonjour”
if 'séquoia' in 'Mon sequoia est vert':
print 'Bonjour'
您应该使用
Unidecode包中的
unidecode
函数:
from unidecode import unidecode
if unidecode(u'séquoia') in 'Mon sequoia est vert':
print 'Bonjour'
你应该看看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
(抱歉,聚会迟到了!!)
不如这样做:
>>> 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':
...