【问题标题】:Match string with normal characters with special characters in python在python中将字符串与带有特殊字符的普通字符匹配
【发布时间】:2016-01-24 11:37:15
【问题描述】:

我正在尝试使用 python 将用户搜索查询与搜索引擎中的数据库记录进行匹配,但是当搜索查询包含特殊字符(例如带重音的元音)时,我遇到了麻烦。

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

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

将包含特殊字符“cafe”的查询与不包含此特殊字符“cafe”的字符串匹配,反之亦然?

更新

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

【问题讨论】:

  • 你使用的是什么正则表达式模式?
  • 还没有正则表达式模式@Alok,只是想我可以使用它但可能匹配太多记录。
  • 您的实际问题或问题是什么?
  • 如果您只搜索完全匹配的单词,并且您的数据库记录只包含单个单词,您可以在数据库中设置第二列,设置为单词的“去重音”版本。然后你可以针对它运行你的数据库查询。它会使你的数据库大小翻倍。
  • @DiegoAgher @TomDalton:我就是这么想的。但是如果有第二列tagsde-accentedaccented 字词会不会更好,以便在两种情况下都可以匹配。

标签: python regex special-characters information-retrieval


【解决方案1】:

实际上,这样做的方法很少。

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

# -*- 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 查询时使用完整的事物信息来创建要匹配的字符串。

【讨论】:

    【解决方案2】:

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

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

    返回的

    cafe
    

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

    【讨论】:

      猜你喜欢
      • 2017-05-19
      • 2014-07-12
      • 2017-04-25
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 2013-05-02
      相关资源
      最近更新 更多