CAS号验证算法编写及测试

发布时间丨2022-04-06 17:04:36作者丨zhaomeng浏览丨46


     化学中有国际统一的命名标准,这个标准就是指定唯一的一个化学物质的名称,每个化学品都有中文名、英文名以及若干的别名,那么如何有效的准确的查找一个正确的化学品呢。CAS号就是唯一的标识,但是如何确保cas号的准确性,数据在传播的过程中难免出现一些错误,可能是人为的也可能是无意输错的。那么我们想要准确的识别出正确cas号就必须了解它的构成即他的命名规范如下:

CAS编号以升序排列且代表其重要程度和命名早晚。一个CAS编号以连字符“-”分为三部分,第一部分有2到6位数字,第二部分有2位数字,第三部分有1位数字作为校验码。校验码的计算方法如下:CAS顺序号(第一、二部分数字)的最后一位乘以1,最后第二位乘以2,依此类推,然后再把所有的乘积相加,再把和除以10,其余数就是第三部分的校验码。 举例来说,水 的CAS编号前两部分是7732-18,则其校验码= ( 8×1 +1×2 + 2×3 + 3×4 + 7×5 + 7×6 ) dim 10 = 105 mod 10 = 5(mod为求余运算符),所以水的CAS为7732-18-5。

下面争对上面的验证的额算法使用python去实现并封装成一个类,方便后面的重复使用,具体代码如下:

import re


class IsCas(object):
    """
    CAS编号以升序排列且代表其重要程度和命名早晚。一个CAS编号以连字符“-”分为三部分,第一部分有2到6位数字,第二部分有2位数字,第三部分有1位数字作为校验码。校验码的计算方法如下:CAS
    顺序号(第一、二部分数字)的最后一位乘以1,最后第二位乘以2,依此类推,然后再把所有的乘积相加,再把和除以10,其余数就是第三部分的校验码。 举例来说,水 的CAS编号前两部分是7732-18,则其校验码= ( 8×1 +
    1×2 + 2×3 + 3×4 + 7×5 + 7×6 ) dim 10 = 105 mod 10 = 5(mod为求余运算符),所以水的CAS为7732-18-5。
    """

    @classmethod
    def iscas(cls, cas: str):
        if cas:
            patter = re.compile(r"^[0-9]{2,7}-[0-9]{2}-[0-9]$")
            result = patter.findall(cas)  # 正则匹配cas
            # print(result)['7732-18-5']
            global flag
            flag = False
            if result:  # 列表不为空
                teststring = cas[:cas.rindex('-')]  # 获取cas号第一个到最后一个'-'之前的字符
                teststring = teststring.replace('-', '')  # 空格替换'-'
                # print("teststring:" + teststring)
                lastchar = cas[-1]  # 获取最后一个字符
                # print(lastchar)
                total = 0
                # print(f"len:{','.join(teststring).split(',')}")
                for i in range(1, len(','.join(teststring).split(',')) + 1):
                    total += int(teststring[-i]) * i
                    # print(total)
                mod = total % 10  # 总和与10取余
                # print(mod)
                if lastchar == str(mod):
                    flag = True
                return flag


if __name__ == '__main__':
    a = IsCas.iscas('7732-18-5')
    print(a)

验证cas号的算法完成,后面只需要传入需要验证的cas号即可返回布尔值。

文章原创,原创不易,如有错误,望及时私信指正!

推荐文章:scrapy如何接受外部传递的参数