首页 > 解决方案 > 验证数据时出现 ValueError

问题描述

我正在尝试创建函数,当值hcl与所需规范正确时返回 True(它在函数的多行注释内)。我想检查的第一件事是该值的长度是否正确(应该是 # + 6 个其他字符),当正确时我会检查所有字符是否都在 af 或 0-9 组中 - 那是我的想法是解决这个问题,但不幸的是有一个

ValueError: substring not found

(当列表的第二个元素进入函数时),我不明白(顺便说一句。一如既往,你有一些推理,当它出现错误时你找不到它,因为对你来说一切都在工作并且这“应该工作”)。

def check_hcl(line):
    '''
    a # followed by exactly six characters 0-9 or a-f.
    '''
    print(line[line.index(':')+1], len(line[line.index(':')+2:]))
    if line[line.index(':')+1] != '#' or len(line[line.index(':')+2:]) != 6:
        return False
    else:
        return True
    


list = ['hcl:#866857','#52a9af','#cfa07d','7d3b0c','#cc0362','#a9784']
                                            #false              #false
for i in list:
    print(check_hcl(i))

标签: pythonvalidationvalueerror

解决方案


您可以使用match()内置re模块中的方法:

import re

def check_hcl(line):
    if re.match("(.*?)#[a-f0-9]{6}", line):
        return True
    return False

list = ['hcl:#866857','#52a9af','#cfa07d','7d3b0c','#cc0362','#a9784']

for i in list:
    print(check_hcl(i))

输出:

True
True
True
False
True
False

解释:

该模式(.*?)#[a-f0-9]{6}可以分解为 3 个部分:

  1. (.*?)匹配任何长度的任何东西,包括长度的子串0

  2. #匹配一个'#'.

  3. [a-f0-9]{6}匹配长度为的字符子a串和f数字。096

感谢@Ian。


推荐阅读