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

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

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

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

【问题讨论】:

标签: python string


【解决方案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 stackoverflow

      【讨论】:

      • 如果单词是“séQuoIa”,这将不起作用,因为remove_accents 方法将所有字符都变成小写。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 2019-09-30
      • 2022-01-01
      相关资源
      最近更新 更多