Mysql Django regexp在字段中
我有一个模型:Mysql Django regexp在字段中,mysql,sql,regex,django,mariadb,Mysql,Sql,Regex,Django,Mariadb,我有一个模型: class M(Model): re = CharacterField(max_length=50, blank=true) 例如,在表I中: table m ---------------- | id | re | ---------------- | 1 | \d+ | | 2 | \:abc | ---------------- 我想通过存储在re字段中的regexp查找与输入字符串(inp)匹配的对象,请参见示例: inp = ":a
class M(Model):
re = CharacterField(max_length=50, blank=true)
例如,在表I中:
table m
----------------
| id | re |
----------------
| 1 | \d+ |
| 2 | \:abc |
----------------
我想通过存储在re
字段中的regexp查找与输入字符串(inp
)匹配的对象,请参见示例:
inp = ":abc"
for m in M.objects.all():
if re.match(m.re, inp)
print("{} matched".format(m.id)) # 2 matched
但是否可以在DB服务器上执行
匹配
?因此,将.all()
替换为“.filter”,并使用一些表达式?对于正则表达式匹配,您需要在过滤器中的fieldname之后使用\uu iregex
调用:
M.objects.filter(re__iregex=inp)
请查看以获取更多信息
编辑
如果要执行反向操作(检查数据库中保存的任何正则表达式是否与您的值匹配),则不能使用简单的过滤器
,但可以定义自定义
请看一下这一点。首先,\d
不是由MySQL处理的。改为使用[0-9]
或[[:digit:]
其次,要在SQL中执行regexp,请构造应用程序
'[0-9]+|:abc'
然后将其构建到查询中
但您可能希望锚定regexp:
'^([0-9]+|:abc)$'
iregex
正向工作-当表中的列与某个正则表达式匹配时,我需要反向操作-某个值与列中的正则表达式匹配。我尝试了M.objects.filter(re_uiregex=“123”).first()
,它返回None
,但应该返回1
,因为123
匹配在\d+
下。谢谢,这是一个有趣且信息丰富的解决方案,有一个问题:它会先从db中选择all,然后在python中找到匹配的对象吗?我的目标是在DB服务器上执行正则表达式匹配(我认为,若表中有许多行,那个么从DB服务器获取所有RAW将并没有效率)。似乎django没有这样的过滤器,所以我需要对where
子句应用一些额外的内容,比如'where{}REGEXP m.re'.format(inp)
,我稍后会尝试。是的-它将按照您所说的方式(首先选择全部,然后在python级别进行过滤)-效率取决于行数。如果您想在DB上执行您自己的select,您可以使用Method感谢您关于\d
的通知,我使用的是MariaDB服务器,它应该支持PCRE regexps。我的任务是找到m
表中存储的re
中与某些输入字符串匹配的行,系统管理员可以输入许多行,它们可以有不同的表达式-2行是非常简化的示例,用于简化问题,没有实际价值,只是技术性的。
'^([0-9]+|:abc)$'
for m in M.objects.filter().extra(where=["'{}' RLIKE `m`.`re`".format(inp)])
print("{} matched".format(m.id))