在Python中,如何查询单词列表以匹配特定的查询条件?

在Python中,如何查询单词列表以匹配特定的查询条件?,python,search,Python,Search,查询条件应支持布尔运算符和正则表达式。我读过Booleano,但它不支持正则表达式 如果没有任何东西符合这一要求,那么哪种技术是开始构建的最佳技术 下面示例中的语法只是一个示例,但它提供的功能应该存在 is True if ('client/.+' and 'user_a') but (not 'limited' unless ('.+special' or 'godmode')) 等于 is True if 'client/.+' and 'user_a' and (not ('limite

查询条件应支持布尔运算符和正则表达式。我读过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']

我使用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
重新导入
导入pyparsing
类BoolRegEx(对象):
def匹配(self,tags=[],query=”“):
self.tags=标记
如果“”不在查询中:
返回self.Search(查询)
其他:
返回pyparsing.operatorRecessence(
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(查询,parseAll=True)[0]
def搜索(自我,a):
尝试:

regex=re.compile(a.replace(“,”~#”).replace(“>”,”).replace("在这种情况下,我认为使用整数——甚至是位运算符——将是一个更好的选择。如果您对这样做感到满意的话,您可以使用中的一个示例创建一种枚举对象。我不知道如何将其用于正则表达式查询。“client/+”本身已经是一个查询了。PyBoolRe非常接近我所需要的,但它是f我希望我可以使用mongodb语法和它的引擎对进程中的列表执行这种类型的查询,而不需要将列表放在db中并通过套接字进行查询。