python中普通字符与特殊字符的匹配

2024-04-25 22:51:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python找到一种方法,将用户搜索查询与搜索引擎中的数据库记录相匹配,但当搜索查询包含特殊字符(如带重音的元音)时,我遇到了麻烦。在

例如:搜索查询='咖啡'。数据库记录='café

我用词干来查询数据库记录。在

将包含特殊字符“café”的查询与不包含此特殊字符“cafe”和viceversa的字符串匹配的最直接的方法是什么?在

更新

我需要的所有信息都已经缓存,所以在数据库中创建新列的方法就不那么吸引人了。我正在寻找一个更基于python的解决方案。在


Tags: 方法用户数据库cafe记录搜索引擎元音咖啡
2条回答

事实上,很少有办法做到这一点。在

我的猜测是最简单最简单(但不是最好的)的方法,通过创建带有字符的特殊映射来实现,这些字符可以相互替换,然后使用该映射创建查询:

# -*- coding: utf-8 -*-


SPECIAL_CHARACTERS_MAP = {
    'e': u'[eé]',
}

def get_query(string):
    pattern_value = u''
    for s in string:
        pattern_value += s if s not in SPECIAL_CHARACTERS_MAP else SPECIAL_CHARACTERS_MAP[s]
    query = u"SELECT * FROM table WHERE record LIKE '%{}%'".format(pattern_value)
    return query


print get_query(u'ewqeé')
# SELECT * FROM table WHERE record LIKE '%[eé]wq[eé]é%'

# Code to query database ....

所以你可以用更多的例子来扩展你的地图,比如'a': 'u[aà]'等等

另一个选择是在数据库中创建单独的列,并使用类似于上面的SPECIAL_CHARACTERS_MAP这样的非常相似的数据结构来填充该列,以使字符的替换更容易,但在这种情况下,必须在将搜索项传递到LIKE查询之前执行相同的替换。在

使用SQL Wildcards运算符执行SELECT查询时,使用完整的信息创建要匹配的字符串。在

最后我用以下代码解决了这个问题:

unicodedata.normalize('NFKD', "café").encode('ascii', 'ignore')

它回来了

^{pr2}$

此方法还可以更正以下字符:ü,ö,á,é,í,ó,ú,ü,ñ,ī

相关问题 更多 >