使用不区分大小写的文本查询pymongo

时间:2017-06-10 08:50:43

标签: python regex mongodb pymongo

以下是我使用pymongo从我的mongodb查询数据的方法:

def is_philippine_facebook(self,facebook_user):
        is_philippine = False
        db_server = self.ConfigSectionMap('db_server')
        database_name = db_server['database']
        db = self.client[database_name]
        cursor = db[collection_name].find({
                'isPhilippine':True,
                'facebook_user': re.compile('@'+facebook_user, re.IGNORECASE)
            })
        for document in cursor:
            if document is not None:
                is_philippine = True
                break
        return is_philippine

实际上,我想查询具有某些facebook_user的具有incasesensitive选项的记录。但是,查询返回许多不正确的结果。 例如,如果facebook_userWWF,则会返回WWF_XYZ的记录。

我该如何解决这个问题? 感谢。

2 个答案:

答案 0 :(得分:2)

使用以下修复程序:

re.compile(r'@{0}\b'.format(facebook_user), re.IGNORECASE)

请参阅regex demo

模式详情

  • @WWF - 文字@WWF
  • \b - 一个单词边界(需要除字母,数字或_以外的字符,或@WWF之后的字符串结尾)

如果facebook_user可能包含特殊字符,则需要使用

re.compile(r'(?<!\w)@{0}(?!\w)'.format(re.escape(facebook_user)), re.IGNORECASE)

但是,facebook_user似乎只包含单词字符,因此在这种情况下,单词边界应该足够了。

答案 1 :(得分:0)

听起来你想要一个单词边界\b

'facebook_user': re.compile('@'+ facebook_user +'\\b', re.IGNORECASE)

因此,如果您提供WWFwwf,那么它只会匹配&#34;字&#34;的结尾。而不是超越它。

作为注释,不区分大小写的搜索不使用插入符^锚定到字符串开头的搜索需要完整的集合扫描,并且效率不高。

如果匹配到字符串的开头,则应该使用插入符号,并且您应该将case作为搜索的文档属性进行规范化,这样您就不需要&#34;不区分大小写&#34;选项。在搜索上使用索引需要这两件事。请参阅文档

中的$regex