【问题标题】:Using cerberus regex to validate string ends with pattern使用 cerberus 正则表达式验证字符串以模式结尾
【发布时间】:2020-05-11 16:11:25
【问题描述】:

cerberus 库表示它允许进行正则表达式验证,但这似乎不适用于各种情况,而且文档很少。在尝试验证字符串是否以“.csv”结尾的情况下,验证总是失败,即使在搜索文件名本身的部分时也是如此。我认为 cerberus 正在后端对传入的正则表达式做一些事情。

# -----
# Import and print versions
# -----
import sys
print(sys.version)
# >>> 3.7.4 (default, Aug 13 2019, 15:17:50) 
#     [Clang 4.0.1 (tags/RELEASE_401/final)]

import cerberus
print(cerberus.__version__)
# >>> 1.3.2

# -----
# Define schema to check file extension is ".csv"
# -----
schema1 = {
    'test': {
        'type': 'string',
        'regex': r'\.csv$'
    }
}
schema2 = {
    'test': {
        'type': 'string',
        'regex': r'\\.csv$'
    }
}
schema3 = {
    'test': {
        'type': 'string',
        'regex': r'test'
    }
}

# -----
# Instantiate validation and run examples
# -----
v = cerberus.Validator()

print(v.validate({'test': 'test.csv'}, schema1))
# >>> False

print(v.validate({'test': 'test.csv'}, schema2))
# >>> False

print(v.validate({'test': 'test.csv'}, schema3))
# >>> False

【问题讨论】:

    标签: python-3.x validation cerberus


    【解决方案1】:

    确实,Cerberus 无论如何都会在约束中添加一个 $ 后缀,因此 r".*\.csv" 应该可以作为约束来解决您的问题。设计原理是多重匹配不是一个用例,明确整个字符串的结构总比不知道要好。

    【讨论】:

    • 这是有道理的,但是在某处有记录吗?我所看到的是:“如果字段的值与提供的正则表达式不匹配,验证将失败。它只在字符串值上进行测试。”。这句话似乎暗示找到匹配项的 any 正则表达式将起作用,而不是模式必须匹配整个字符串。如果文档中确实没有任何确认信息,我可能会在 repo 上打开一个问题以更新文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多