在Python中,如何查询符合特定查询条件的单词列表?

发布于 2021-01-29 15:01:35

查询条件应支持布尔运算符和正则表达式。我已经读过关于Booleano的文章,但是它不支持正则表达式。

如果没有满足此要求的东西,那将是开始构建的最佳技术?

以下示例中的语法只是一个示例,但是它提供的功能应该存在。

is True if ('client/.+' and 'user_a') but (not 'limited' unless ('.+special' or 'godmode'))

等于

is True if 'client/.+' and 'user_a' and (not ('limited' and (not ('.+special' or 'godmode'))))

适用于以下清单

is_true  = ['client/chat', 'user_a', 'limited', 'extraspecial']
is_false = ['client/ping', 'user_a', 'limited']
is_false = ['server/chat']
is_false = ['server/ping', 'ping']
关注者
0
被浏览
62
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我设法使用pyparsing模块解决了这个问题。

    import re
    import pyparsing
    
    class BoolRegEx(object):
    
      def Match(self, tags=[], query=""):
        self.tags = tags
        if ' ' not in query:
          return self.Search(query)
        else:
          return pyparsing.operatorPrecedence(
            pyparsing.Word(pyparsing.printables, excludeChars="()"), [
              (pyparsing.Literal("NOT"), 1, pyparsing.opAssoc.RIGHT, self.Not),
              (pyparsing.Literal("OR"),  2, pyparsing.opAssoc.LEFT,  self.Or),
              (pyparsing.Literal("AND"), 2, pyparsing.opAssoc.LEFT,  self.And),
            ]
          ).parseString(query, parseAll=True)[0]
    
      def Search(self, a):
        try:
          regex = re.compile(a.replace("<<", "#~").replace(">>", "~#").replace(">", ")").replace("<", "(").replace("#~", "<").replace("~#", ">"))
          for tag in self.tags:
            match = regex.match(tag)
            if match and len(match.group(0)) == len(tag):
              return True
          return False
        except:
          raise
    
      def And(self, t):
        for a in t[0][0::2]:
          if isinstance(a, basestring):
            v = self.Search(a)
          else:
            v = bool(a)
          if not v:
            return False
        return True
    
      def Or(self, t):
        for a in t[0][0::2]:
          if isinstance(a, basestring):
            v = self.Search(a)
          else:
            v = bool(a)
          if v:
            return True
        return False
    
      def Not(self, t):
        a = t[0][1]
        if isinstance(a, basestring):
          return not self.Search(a)
        else:
          return not bool(a)
    
    print BoolRegEx().Match(['client/chat', 'user_a', 'limited', 'extraspecial'], "client/.+ AND user_a AND NOT ( limited AND NOT ( .+<r|i>special OR godmode ) )")
    # False
    
    print BoolRegEx().Match(['client/chat', 'user_a', 'limited', 'superspecial'], "client/.+ AND user_a AND NOT ( limited AND NOT ( .+<r|i>special OR godmode ) )")
    # True
    

    为了避免发生冲突,我必须用<>替换regexp(),但是目前所有这些似乎都是最好的解决方案。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看