Django搜索存储在模型中的regexp列表
这是我的问题。Django搜索存储在模型中的regexp列表,regex,django,django-models,filtering,Regex,Django,Django Models,Filtering,这是我的问题。 比如说,我有一个带有regexp列表的模型 |__Field_| | (\w+) | | ([op]+)| | .* | | others.| 我有一个单词列表,比如('cat'、'dog'、'wolf'),我需要找到模型中存储的哪个regexp与列表中的一个单词(或多个单词)匹配… 它就像一个逆正则表达式过滤器。 如何实现此功能 有没有更好的方法来做这样的事情 谢谢 正如@DrTyrsa评论的那样,除了循环处理每个案例之外,我非常怀疑有什么“方法
比如说,我有一个带有regexp列表的模型
|__Field_|
| (\w+) |
| ([op]+)|
| .* |
| others.|
我有一个单词列表,比如('cat'、'dog'、'wolf'),我需要找到模型中存储的哪个regexp与列表中的一个单词(或多个单词)匹配…它就像一个逆正则表达式过滤器。
如何实现此功能 有没有更好的方法来做这样的事情 谢谢 正如@DrTyrsa评论的那样,除了循环处理每个案例之外,我非常怀疑有什么“方法”可以做到这一点 如果性能是一个问题,我想您可以进行一些优化。例如,假设您的许多正则表达式都有
\w\w+
(即包含两个或多个字母的单词)。您可以只根据\w\w+
检查每个单词,例如“cat”或“1234”,如果单词不匹配,则不必费心运行其余的正则表达式,因为它们都依赖于一个组件
当然,零接受量词?
,*
,和{}
,以及交替运算符|
,使得这一特定想法不可能实现,除非您将正则表达式正则化以过滤掉^[^?*{}]+$
。但现在我们变得越来越可笑了。你需要一种“regex层次结构”来实现这样的“优化”,这已经很疯狂了。我认为其他人可以提出更实际的优化
祝你好运。我非常怀疑是否有一种“方法”可以做到这一点,而不是像@DrTyrsa所说的那样循环处理每个案例
如果性能是一个问题,我想您可以进行一些优化。例如,假设您的许多正则表达式都有\w\w+
(即包含两个或多个字母的单词)。您可以只根据\w\w+
检查每个单词,例如“cat”或“1234”,如果单词不匹配,则不必费心运行其余的正则表达式,因为它们都依赖于一个组件
当然,零接受量词?
,*
,和{}
,以及交替运算符|
,使得这一特定想法不可能实现,除非您将正则表达式正则化以过滤掉^[^?*{}]+$
。但现在我们变得越来越可笑了。你需要一种“regex层次结构”来实现这样的“优化”,这已经很疯狂了。我认为其他人可以提出更实际的优化
祝你好运。你没有指定两件重要的事情:
- 你在使用什么数据库
- 您可以在PCRE和POSIX正则表达式之间切换吗
Model.objects.extra(where=[sql_regex('REGEX_COLUMN')], params=['TEXT TO MATCH']).all()
其中sql\u 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]
来获取预定义的模式,以查询存储在数据库后端中的正则表达式。您没有指定两个重要的内容:
- 你在使用什么数据库
- 您可以在PCRE和POSIX正则表达式之间切换吗
Model.objects.extra(where=[sql_regex('REGEX_COLUMN')], params=['TEXT TO MATCH']).all()
其中sql\u 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]
来获得预定义的模式,以查询存储在数据库后端中的正则表达式。通过使用两个进行m*n次迭代。m-字数,n-正则表达式数。我认为没有更快的办法。你想解决什么任务?我想匹配一个用户的简短短语,比如说“需要啤酒”。。。我将去掉“a”(这是无用的),并在我的模型行中搜索需求和啤酒。对于任何较大的输入或行数,这将是非常缓慢的-基本上是一种蛮力方法。这些行实际上代表什么?使用两个循环进行m*n次迭代。m-字数,n-正则表达式数。我认为没有更快的办法。你想解决什么任务?我想匹配一个用户的简短短语,比如说“需要啤酒”。。。我将去掉“a”(这是无用的),并在我的模型行中搜索需求和啤酒。对于任何较大的输入或行数,这将是非常缓慢的-基本上是一种蛮力方法。这些行实际上代表什么?是的。。你是对的,完成这项任务似乎非常缓慢,也不可能进行优化。我会试试更好的办法是的。。你是对的,完成这项任务似乎非常缓慢,也不可能进行优化。我会尝试一个更好的方法我现在正在使用MySQL。。。我不知道如何检查你问我的第二个问题..MySQL内置正则表达式支持使用POSIX ERE,有关更多信息,请查看以下链接:我目前正在使用MySQL。。。我不知道如何检查你问我的第二个问题..MySQL内置regex支持使用POSIX ERE,有关更多信息,请查看以下链接: