从字符串中删除变音符号以进行搜索功能

Pet*_*ung 1 python django python-3.x

我正在使用Django开发一个简单的网页,我需要实现搜索功能.我目前正在使用这样的东西:

search_box = request.GET['search_box']
X = Foo.objects.filter(Q(title__contains=search_box) | Q(info__contains=search_box)).values()
Run Code Online (Sandbox Code Playgroud)

如果指定的列包含搜索的字符串,它会检查我的数据库,但如果我搜索"kočík"但我的数据库包含"kocik",该怎么办?我如何在Python 3中从字符串中删除diacritis,或者实现它的最佳方法是什么?谢谢

mjw*_*ich 6

您可以使用unicodedata包.

import unicodedata
def shave_marks(txt):
    """This method removes all diacritic marks from the given string"""
    norm_txt = unicodedata.normalize('NFD', txt)
    shaved = ''.join(c for c in norm_txt if not unicodedata.combining(c))
    return unicodedata.normalize('NFC', shaved)
Run Code Online (Sandbox Code Playgroud)

有关此算法的一些细节:

变音符号的主要问题是,在UTF-8中,有些组合字符会修改前面的字符,而其他字符则包含在字符中.例如,'café'并且'cafe/u0301'看起来是一样的.

来自https://docs.python.org/2/library/unicodedata.html:

即使两个unicode字符串被规范化并且看起来与人类读者相同,如果一个具有组合字符而另一个没有,则它们可能无法相等.

该算法首先分解一个字符串(使用'NFD'方法),使所有变音符号成为组合字符,然后过滤掉所有组合字符,最后组成字符串(使用'NFC'方法).