这是我的问题。
我有一个带有regexp列表的模型,比如说
|__Field_|
| (\w+) |
| ([op]+)|
| .* |
| others.|
我有一个单词列表,比如说('cat',“dog”,“wolf”),我需要找到我的模型中存储的正则表达式与列表中的单词(或多个单词)匹配。 ..
它就像一个反向__regexp过滤器
我该如何实现这一功能?
有没有更好的方法来做这样的事情?
谢谢!
答案 0 :(得分:3)
您没有指定两件重要的事情:
假设您使用的数据库允许使用正则表达式执行查询,并且您的数据库支持您需要的标准(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”,如果单词不匹配,那么您不必费心去运行其余的正则表达式,因为它们都依赖于那个组件
当然,零接受量词?
,*
和{}
以及交替运算符|
使得这个特定的想法变得不可能,除非你正则表达式正则表达式过滤掉^[^?*{}]+$
。但现在我们变得荒谬了。你需要一种“正则表达式层次结构”来实现这样的“优化”已经很疯狂了。我认为其他人可以提出更实际的优化。