0

我正在尝试构建一个用户能够定义和测试自己的正则表达式模式的系统。为此,我有以下设置:

import re

class ExtendedRegexValidator(models.Model):
    pattern = models.TextField(
        _('pattern'),
        help_text=_('Required. Must be a valid regular expression pattern.')
    )

    def save(self, *args, **kwargs):
        try:
            re.compile(self.pattern)
        except Exception as e:
            # handle exception
        super(ExtendedRegexValidator, self).save(*args, **kwargs)

在保存之前,我尝试使用pattern模型字段的值编译一个正则表达式模式,即TextField. 这真的有必要吗?有没有更理想的方法来做到这一点?这种感觉有点hacky。

4

1 回答 1

1

这真的有必要吗?

是的,验证是必要的,因为会有有效的字符串不是有效的正则表达式。请参阅 Python 的文档re.error

当传递给此处函数之一的字符串不是有效的正则表达式(例如,它可能包含不匹配的括号)或在编译或匹配期间发生其他错误时引发异常。

其他人建议在表单提交期间进行此验证,但为了数据完整性,我认为您在模型层进行此验证是正确的。在您的处理中re.error,您可以提出一个ValidationError可以在表单提交层捕获的。

有没有更理想的方法来做到这一点?这种感觉有点hacky。

您的验证代码符合 Python 的EAFP理念:

请求宽恕比请求许可更容易。这种常见的 Python 编码风格假设存在有效的键或属性,如果假设被证明是错误的,则捕获异常。这种干净快速的风格的特点是存在许多tryexcept陈述。该技术与许多其他语言(如 C)常见的LBYL风格形成鲜明对比。

我也没有看到任何内置方法可以在不尝试使用或编译它的情况下将字符串验证为正则表达式模式。但是,我建议为正则表达式模式创建一个自定义模型字段,以便您可以封装此验证并可能在其他模型中重用该功能。

于 2019-04-08T03:54:21.713 回答