2

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

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

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

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

谢谢!

4

2 回答 2

3

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

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

假设您使用的数据库允许使用正则表达式执行查询,并且您的数据库支持您需要的标准(PCRE/POSIX),您可以使用extra() Queryset 修饰符__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]预定义的模式来查询存储在数据库后端的正则表达式。

于 2012-05-18T20:02:00.603 回答
1

正如@DrTyrsa 评论的那样,除了遍历每个案例之外,我非常怀疑是否有一种“方法”可以做到这一点。

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

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

祝你好运。

于 2012-05-18T14:52:09.617 回答