首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >野外Django regexp

野外Django regexp
EN

Stack Overflow用户
提问于 2016-02-19 13:50:22
回答 3查看 2K关注 0票数 4

我有模特:

代码语言:javascript
复制
class M(Model):
    re = CharacterField(max_length=50, blank=true)

例如,在表中我有:

代码语言:javascript
复制
table m
----------------
| id  |  re    |
----------------
|  1  |  \d+   |
|  2  |  \:abc |
----------------

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

代码语言:javascript
复制
inp = ":abc"
for m in M.objects.all():
    if re.match(m.re, inp)
        print("{} matched".format(m.id)) # 2 matched

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-22 15:30:30

代码语言:javascript
复制
for m in M.objects.filter().extra(where=["'{}' RLIKE `m`.`re`".format(inp)])
    print("{} matched".format(m.id))
票数 2
EN

Stack Overflow用户

发布于 2016-02-19 14:27:55

对于正则表达式匹配,需要在__iregex调用中在字段名之后使用filter

代码语言:javascript
复制
    M.objects.filter(re__iregex=inp)

查看正式文件以获取更多信息

编辑

如果您想要反向操作(检查保存在数据库中的任何regex是否与您的值匹配),您不能使用简单的filter,但可以定义自定义的经理

代码语言:javascript
复制
class CurrentManager(models.Manager):
    def match(self, value):
        objects = super(CurrentManager, self).get_query_set().all()

        #here your code
        objects = [o for o in objects if re.match(o, value)]

        return objects

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

#usage
matched = M.objects.match('123')

也请看一下这个问题

票数 2
EN

Stack Overflow用户

发布于 2016-02-19 17:44:35

首先,\d不是由MySQL处理的。使用[0-9][[:digit:]]

其次,要在SQL中执行regexp,请让您的app构造。

代码语言:javascript
复制
'[0-9]+|:abc'

然后将其构建到查询中。

但是您可能想锚定regexp:

代码语言:javascript
复制
'^([0-9]+|:abc)$'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35506944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档