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号即可返回布尔值。
文章原创,原创不易,如有错误,望及时私信指正!