Django regexp在现场

时间:2016-02-19 13:50:22

标签: mysql sql regex django mariadb

我有模特:

class M(Model):
    re = CharacterField(max_length=50, blank=true)

例如,在表格中我有:

table m
----------------
| id  |  re    |
----------------
|  1  |  \d+   |
|  2  |  \:abc |
----------------

我想通过存储在inp字段中的regexp找到一些与我的输入字符串(re)匹配的对象,参见示例:

inp = ":abc"
for m in M.objects.all():
    if re.match(m.re, inp)
        print("{} matched".format(m.id)) # 2 matched

但是可以在数据库服务器上执行match吗?所以用一些表达式将.all()替换为'.filter'?

3 个答案:

答案 0 :(得分:2)

对于正则表达式匹配,您需要在content-noen.php调用中的字段名后使用__iregex

filter

查看official documentation以获取更多信息

编辑

如果您想要反向操作(检查数据库中保存的任何正则表达式是否与您的值匹配),您不能使用简单 M.objects.filter(re__iregex=inp) ,但可以定义自定义Manager

filter

另请查看此question

答案 1 :(得分:2)

首先,MySQL不处理\d。请改用[0-9][[:digit:]]

其次,要在SQL中执行regexp,请构建应用

'[0-9]+|:abc'

然后将其构建到查询中。

但你可能想要锚定正则表达式:

'^([0-9]+|:abc)$'

答案 2 :(得分:1)

for m in M.objects.filter().extra(where=["'{}' RLIKE `m`.`re`".format(inp)])
    print("{} matched".format(m.id))