【问题标题】:Django search a list of regexp stored in a modelDjango搜索存储在模型中的正则表达式列表
【发布时间】:2012-05-26 01:25:34
【问题描述】:

这是我的问题。
我有一个带有正则表达式列表的模型,比如

|__Field_|  
| (\w+)  |  
| ([op]+)|  
| .*     |  
| others.|  

我有一个单词列表,比如说 ('cat', "dog", "wolf"),我需要找到存储在模型中的哪个正则表达式与列表中的一个单词(或多个单词)匹配。 ..
这就像一个反向 __regexp 过滤器。
我怎样才能实现这个功能?

有没有更好的方法来做这样的事情?

谢谢!

【问题讨论】:

  • 通过使用两个 for 循环 m * n 迭代。 m - 单词数,n - 正则表达式数。我认为没有更快的方法。你想解决什么任务?
  • 我正在尝试匹配用户的一个短语,比如说“需要啤酒”...我将去掉“a”(这是无用的),然后我会搜索需要和啤酒在我模特的行中
  • 对于任何相当大的输入或行数,这将非常缓慢 - 基本上是一种蛮力方法。这些行实际上代表什么?

标签: regex django django-models filtering


【解决方案1】:

你没有指定两个重要的事情:

  • 您使用的是什么数据库?
  • 您可以在 PCRE 和 POSIX 正则表达式之间切换吗?

假设您使用的数据库允许使用正则表达式执行查询,并且您的数据库支持您需要的标准 (PCRE/POSIX),您可以使用 extra() Queryset modifier 反转 __regex 过滤器。看看下面的代码:

Model.objects.extra(where=[sql_regex('REGEX_COLUMN')], params=['TEXT TO MATCH']).all()

sql_regex() 代码类似于:

from django.db import backend

def sql_regex(column, type='regex'):
    op = backend.DatabaseWrapper.operators[type].replace('%s', column)
    return '%s ' + op

我使用backend.DatabaseWrapper.operators[type] 获取预定义模式来查询存储在数据库后端的正则表达式。

【讨论】:

【解决方案2】:

我非常怀疑是否有一种“方法”可以做到这一点,而不是像@DrTyrsa cmets 那样循环遍历每个案例。

我想你可以做一些优化,如果性能是一个问题。例如,假设您的许多正则表达式都有\w\w+(即具有两个或多个字母的单词)。您可以检查每个单词,例如"cat" 或 "1234" 仅针对 \w\w+,如果单词不匹配,那么您不必费心运行其余的正则表达式,因为它们都依赖于那个组件。

当然,接受零的量词?*{} 以及交替运算符| 使这个特殊的想法变得不可能,除非您正则表达式您的正则表达式以过滤掉^[^?*{}]+$。但现在我们变得可笑了。你需要一种“正则表达式层次结构”来实现这样的“优化”已经很疯狂了。我认为其他人可以提出更实用的优化。

祝你好运。

【讨论】:

  • 是的..你说得对,这似乎是一项极其缓慢的任务,而且也无法优化。我会尝试更好的方法
猜你喜欢
  • 2021-02-09
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多