Django搜索存储在模型中的正则表达式列表

时间:2012-05-18 13:02:36

标签: regex django django-models filtering

这是我的问题。
我有一个带有regexp列表的模型,比如说

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

您没有指定两件重要的事情:

  • 您使用的是哪个数据库?
  • 您可以在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]获取预定义模式来查询存储在数据库后端中的正则表达式。

答案 1 :(得分:1)

我非常怀疑除了循环每个案例之外,还有一种方法可以做到这一点,就像@DrTyrsa评论一样。

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

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

祝你好运。