在 python 中用普通字符和特殊字符匹配字符串

Match string with normal characters with special characters in python

我正在尝试找到一种方法,使用 python 将用户搜索查询与搜索引擎中的数据库记录相匹配,但当搜索查询包含元音等特殊字符时,我遇到了麻烦有口音。

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

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

将包含特殊字符 'café' 的查询与不包含此特殊字符 'cafe' 的字符串进行匹配的最直接方法是什么,反之亦然?

更新

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

实际上有几种方法可以做到这一点。

我的猜测是最简单和最简单的(但不是最好的)方法通过创建带有字符的特殊地图来为您做到这一点可以相互替换并且比使用该地图创建查询:

# -*- 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 是使用完整的事物信息来创建您在使用 LIKE 运算符执行 SELECT 查询时要匹配的字符串。

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

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

返回

cafe

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