比较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中的重音[重复]的主要内容,如果未能解决你的问题,请参考以下文章