转自:
  https://blog.csdn.net/warrah/article/details/69338912

  https://blog.csdn.net/qq_37142340/article/details/80695187
  https://blog.csdn.net/u013361668/article/details/51595169
  https://blog.csdn.net/feiyunw/article/details/83190319

import re
class UnifiedSocialCreditIdentifier(object):
'''
统一社会信用代码 + 组织结构代码校验
''' def __init__(self):
'''
Constructor
'''
# 统一社会信用代码中不使用I,O,S,V,Z
# ''.join([str(i) for i in range(10)])
# import string
# string.ascii_uppercase # ascii_lowercase | ascii_letters
# dict([i for i in zip(list(self.string), range(len(self.string)))])
# dict(enumerate(self.string))
# list(d.keys())[list(d.values()).index(10)]
# chr(97) --> 'a'
self.string1 = '0123456789ABCDEFGHJKLMNPQRTUWXY'
self.SOCIAL_CREDIT_CHECK_CODE_DICT = {
'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,
'A':10,'B':11,'C':12, 'D':13, 'E':14, 'F':15, 'G':16, 'H':17,
'J':18, 'K':19, 'L':20, 'M':21, 'N':22, 'P':23, 'Q':24,
'R':25, 'T':26, 'U':27, 'W':28, 'X':29, 'Y':30}
# 第i位置上的加权因子
self.social_credit_weighting_factor = [1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28] # GB11714-1997全国组织机构代码编制规则中代码字符集
self.string2 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
self.ORGANIZATION_CHECK_CODE_DICT = {
'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,
'A':10,'B':11,'C':12, 'D':13, 'E':14, 'F':15, 'G':16, 'H':17,'I':18,
'J':19, 'K':20, 'L':21, 'M':22, 'N':23, 'O':24,'P':25, 'Q':26,
'R':27,'S':28, 'T':29, 'U':30,'V':31, 'W':32, 'X':33, 'Y':34,'Z':35}
# 第i位置上的加权因子
self.organization_weighting_factor = [3,7,9,10,5,8,4,2] def check_social_credit_code(self, code):
'''
统一社会信用代码校验
国家标准GB32100—2015:18位统一社会信用代码从2015年10月1日正式实行,
标准规定统一社会信用代码用18位阿拉伯数字或大写英文字母(不使用I、O、Z、S、V)表示,
分别是1位登记管理部门代码、1位机构类别代码、6位登记管理机关行政区划码、9位主体标识码(组织机构代码)、1位校验码 税号 = 6位行政区划码 + 9位组织机构代码
计算校验码公式:
C18 = 31-mod(sum(Ci*Wi),31)
其中Ci为组织机构代码的第i位字符,Wi为第i位置的加权因子,C18为校验码
c18=30, Y; c18=31, 0
'''
# 主要是避免缺失值乱入
#if type(code) != str: return False
# 转大写
code = code.upper()
# 1. 长度限制
if len(code) != 18:
print('{} -- 统一社会信用代码长度不等18!'.format(code))
return False
# 2. 不含IOSVZ -- 组成限制, 非字典表给个非常大的数, 不超过15000
'''lst = list('IOSVZ')
for s in lst:
if s in code:
print('包含非组成字符:%s' % (s))
return False''' # 2. 组成限制
# 登记管理部门:1=机构编制; 5=民政; 9=工商; Y=其他
# 机构类别代码:
'''
机构编制=1:1=机关 | 2=事业单位 | 3=中央编办直接管理机构编制的群众团体 | 9=其他
民政=5:1=社会团体 | 2=民办非企业单位 | 3=基金会 | 9=其他
工商=9:1=企业 | 2=个体工商户 | 3=农民专业合作社
其他=Y:1=其他
'''
reg = r'^(11|12|13|19|51|52|53|59|91|92|93|Y1)\d{6}\w{9}\w$'
if not re.match(reg, code):
print('{} -- 组成错误!'.format(code))
return False # 3. 校验码验证
# 本体代码
ontology_code = code[:17]
# 校验码
check_code = code[17]
# 计算校验码
tmp_check_code = self.gen_check_code(self.social_credit_weighting_factor,
ontology_code,
31,
self.SOCIAL_CREDIT_CHECK_CODE_DICT)
if tmp_check_code == -1:
print('{} -- 包含非组成字符!'.format(code))
return False tmp_check_code = (0 if tmp_check_code==31 else tmp_check_code)
if self.string1[tmp_check_code] == check_code:
#print('{} -- 统一社会信用代码校验正确!'.format(code))
return True
else:
print('{} -- 统一社会信用代码校验错误!'.format(code))
return False def check_organization_code(self, code):
'''
组织机构代码校验
该规则按照GB 11714编制:统一社会信用代码的第9~17位为主体标识码(组织机构代码),共九位字符
计算校验码公式:
C9 = 11-mod(sum(Ci*Wi),11)
其中Ci为组织机构代码的第i位字符,Wi为第i位置的加权因子,C9为校验码
C9=10, X; C9=11, 0
@param code: 统一社会信用代码 / 组织机构代码
'''
# 主要是避免缺失值乱入
#if type(code) != str: return False
# 1. 长度限制
if len(code) != 9:
print('{} -- 组织机构代码长度不等9!'.format(code))
return False # 2. 组成限制
reg = r'^\w{9}$'
if not re.match(reg, code):
print('{} -- 组成错误!'.format(code))
return False # 3. 校验码验证
# 本体代码
ontology_code = code[:8]
# 校验码
check_code = code[8]
# 计算校验码
tmp_check_code = self.gen_check_code(self.organization_weighting_factor,
ontology_code,
11,
self.ORGANIZATION_CHECK_CODE_DICT)
if tmp_check_code == -1:
print('{} -- 包含非组成字符!'.format(code))
return False tmp_check_code = (0 if tmp_check_code==11
else (33 if tmp_check_code==10 else tmp_check_code))
if self.string2[tmp_check_code] == check_code:
#print('{} -- 组织机构代码校验正确!'.format(code))
return True
else:
print('{} -- 组织机构代码校验错误!'.format(code))
return False def check_code(self, code, code_type='sc'):
'''Series类型
@code_type {org, sc}'''
#try:
if type(code) != str: return False
if code_type == 'sc':
return self.check_social_credit_code(code)
elif code_type == 'org':
return self.check_organization_code(code)
else:
if len(code)==18:
return self.check_social_credit_code(code)
else:
return self.check_organization_code(code) if len(code)==9 else False
#except Exception as err:
# print(err)
# print('code:', code) def gen_check_code(self, weighting_factor, ontology_code, modulus, check_code_dict):
'''
@param weighting_factor: 加权因子
@param ontology_code:本体代码
@param modulus: 模数(求余用)
@param check_code_dict: 字符字典
'''
total = 0
for i in range(len(ontology_code)):
if ontology_code[i].isdigit():
#print(ontology_code[i], weighting_factor[i])
total += int(ontology_code[i]) * weighting_factor[i]
else:
num = check_code_dict.get(ontology_code[i], -1)
if num < 0: return -1
total += num * weighting_factor[i]
diff = modulus - total % modulus
#print(diff)
return diff if __name__ == '__main__':
# 统一社会信用代码及组织机构代码校验
u = UnifiedSocialCreditIdentifier()
print(u.check_social_credit_code(code='91330382575324831A'))
print(u.check_organization_code(code='575324831'))

  

统一社会信用代码+组织机构代码 校验 python的更多相关文章

  1. JS实现统一社会信用代码的效验(组织机构代码效验)

    参考原文https://blog.csdn.net/hdhxby/article/details/56015370 部分错误,修改整合了下 想查询数据的,请点击:统一信用代码查询地址 查看效验规则点击 ...

  2. 精准准确的统一社会信用代码正则(js)

    参照标准: <GB_32100-2015_法人和其他组织统一社会信用代码编码规则.> 按照编码规则: 统一代码为18位,统一代码由十八位的数字或大写英文字母(不适用I.O.Z.S.V)组成 ...

  3. 【NumberValidators】工商营业执照号码和统一社会信用代码验证

    从本质上讲,工商营业执照号码和统一社会信用代码是两套完全不一样的编码规则,识别结果也仅有行政区划部分为两者共有,但因为这两种编码同时存在的原因,所以如果需要在系统中唯一标志一家企业时,还是可以通过工商 ...

  4. 使用js对社会信用代码进行正则验证

    注:参考了该博客(https://blog.csdn.net/qq_37142340/article/details/80695187)进行了一些修改,本文验证使用在微信小程序上. 直接贴代码: va ...

  5. 用Python生成组织机构代码,附源码

    #!/usr/bin/python import random def haoma(): ww = [3,7,9,10,5,8,4,2]#suan fa yin zi cc = [] dd=0 for ...

  6. Atitit.http代理的实现 代码java php c# python

    Atitit.http代理的实现 代码java php c# python 1. 代理服务器用途 代理服务器看成是一种扩展浏览器功能的途径.例如,在把数据发送给浏览器之前,可以用代理服务器压缩数据 调 ...

  7. ASP.NET 企业组织机构代码验证

    /// <summary> /// 组织机构代码验证 /// </summary> /// <param name="arg"></par ...

  8. 2018-06-21 中文代码示例视频演示Python入门教程第五章 数据结构

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第四章 控制流 对应在线文档: 5. Data Structures 这一章起初还是采取了尽量与原例程相近的汉化方式, 但有些语义较偏(如T ...

  9. 2018-06-20 中文代码示例视频演示Python入门教程第四章 控制流

    知乎原链 续前作: 中文代码示例视频演示Python入门教程第三章 简介Python 对应在线文档: 4. More Control Flow Tools 录制中出了不少岔子. 另外, 输入法确实是一 ...

随机推荐

  1. C# winform 选择文件保存路径

    1.winform 点击按钮选择文件保存的路径,效果如下图: 具体代码如下: private void button8_Click(object sender, EventArgs e) { Fold ...

  2. 【SMTP】常见错误码

    '* 邮件服务返回代码含义 '* 500 格式错误,命令不可识别(此错误也包括命令行过长) '* 501 参数格式错误 '* 502 命令不可实现 '* 503 错误的命令序列 '* 504 命令参数 ...

  3. ssm+redis整合之redis连接池注入

    package com.tp.soft.redis; import javax.annotation.Resource; import org.springframework.beans.factor ...

  4. vue 2.0 使用replace时要点击路由多次才能返回

    项目中有一个选择机场的需求,从表单页面--->机场页面(选择出发机场)-->表单页面-->机场页面(选择到达机场); 如果只用push跳转的话,页面返回必然会返回机场选择页面. 所以 ...

  5. 前端UI框架选择区别对比推荐

    UI选择务必慎重,货比三家. 弱水三千只取一瓢:弱水三千只取一瓢,源起佛经中的一则故事,警醒人们在一生中可能会遇到很多美好的东西,但只要用心好好把握住其中的一样就足够了 老牌构建于jQuery框架之上 ...

  6. word->excel数据处理

    朋友发来一个word文件,里面的数据没有分割,想分割后放到excel统计 通常遇到这种数据,首先想到每一列数据有没有什么特征 类似这种数据,一种办法是按位数截取,mid函数,或者按第一次出现数字的方式 ...

  7. 实现mypwd&mybash&myod&读者写者

    目录: 一.mypwd 二.mybash 三.myod 四.读者.写者 一.实现mypwd 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试m ...

  8. Lab 7-2

    Analyze the malware found in the file Lab07-02.exe. Questions and Short Answers How does this progra ...

  9. mysql linux安装教程

    1.下载 下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads 下载版本:我这里选择的5.6.33,通用版,linux下64位 也可 ...

  10. Centos7 多网卡抓包可以抓到UDP但程序recvfrom不到

    问题: Centos7多网卡,抓包时发现某网卡上有UDP包,但是用程序recvfrom无法接收到消息. 解决步骤: 1.确认防火墙是否关闭: 已关闭 2.确认网卡是否开启过滤:cat /proc/sy ...