如何处理Pydantic的正则表达式验证?

3
我正在尝试使用Pydantic编写验证器来验证以下字符串(示例):1.1.0, 3.5.6, 1.1.2等。

我在以下语法上失败了:

install_component_version: constr(regex=r"^[0-9]+.[0-9]+.[0-9]$")
install_component_version: constr(regex=r"^([0-9])+.([0-9])+.([0-9])$")
install_component_version: constr(regex=r"^([0-9])\.([0-9])\.([0-9])$")

有人能帮我看一下正则表达式的语法应该是什么样子的吗?


r'^(\d+\.){2}\d+$' 应该可以工作吗? - SUTerliakov
感谢 @SUTerliakov 的回复。不幸的是,我仍然在 precommit 中遇到错误:无效的类型注释或注解 [valid-type] 注意:建议使用 constr[...] 而不是 constr(...) - Maciej
你能否分享一下,你的“我失败了”是什么情况?你正在执行哪些代码?你期望得到的输出是什么?你遇到的精确错误信息或错误输出是什么?难道不能提出一个恰当的问题,包含完整的错误信息和可重现的示例吗? - Daniil Fajnberg
@Maciej,这个链接可能会对你有所帮助:https://github.com/pydantic/pydantic/issues/156#issuecomment-614748288 或者其他相关建议。 - python_user
1
尝试使用类似于install_component_version: str = Field(regex=r"^[0-9]+.[0-9]+.[0-9]$")的东西,错误与正则表达式无关,而是与类型注释有关。如果我正确理解问题,您可以通过使用Field来解决这个问题,正则表达式需要您自己解决。 - python_user
2个回答

3
您面临的错误是由于类型注释引起的。
根据https://github.com/pydantic/pydantic/issues/156,这个问题还没有被修复,您可以尝试使用pydantic.Field,然后在那里传递regex参数像这样install_component_version: str = Field(regex=r"^[0-9]+.[0-9]+.[0-9]$") 这样您就可以得到正则表达式验证和类型检查。
PS:这并不是constr的完全替代方案,但如果您想要的仅仅是正则表达式验证,上述替代方案可以工作,并让mypy满意。

有没有办法创建一个正则表达式列表?我需要这样做是因为我需要验证一组正则表达式。我已经使用了componend = list(str) = Field(regex = list(regex_vals),但是我得到了一个错误,提到当使用regex参数时无法使用list。有没有办法像这样解决它?谢谢! - Danny
@Danny 我需要检查一下,但是你期望的输出是字符串应该匹配列表中的所有正则表达式吗? - python_user
是的,但如果正则表达式与列表中的正则表达式不匹配,则返回null或false会更好。然而,如果目前无法实现这一点,则没有必要。 - Danny
@Danny:如何将正则表达式进行链接/使用替代类型?例如,pattern="^(regex1)|(regex2)|....$"component: list[ constr(pattern=regex1) | constr(pattern=regex2) ] - ted

0
在较新版本的pydantic中,使用pattern代替regex: 示例:
class MyClass(BaseModel):
    """
    Model of my class
    """

    my_field: str = Field(min_length=10, max_length=10, pattern=r"[A-Z]\d{9}")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接