# DataWarehouseNameGovern **Repository Path**: cylc1002/data-warehouse-name-govern ## Basic Information - **Project Name**: DataWarehouseNameGovern - **Description**: 数仓中指标体系需要清晰合理的命名规范,本仓库基于Python+Networkx构建了基于命名的有限状态自动机,实现了命名的规范化验证,同时能够进行自动补全。 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-08-22 - **Last Updated**: 2025-08-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 数据治理之表名+字段名校验 ### 1. 基本思路 - 工具:有限自动机+正规式 - 有限自动机的原理图: ![图1.1 有限自动机原理图](readme_resources/DFA原型.jpg) ### 2. todo list * [x] 利用sample数据,设计有限自动机 * [ ] 理解业务、数据、形式化描述命名规则 * [ ] 和业务、数分对接,确保词根、语法的一致性 * [x] 构造有限自动机(原型) * [x] 化简有限自动机(原型) * [x] 正则表达式 + [x] 日期:理解日期命名规范 + [ ] 和业务数分对接,设计、调整正规式 * [ ] 开发 + [x] 实现有限自动机(原型) + [x] 发现的问题: + 对于不同输入的处理,鲁棒性较差 + 不够灵活、不能扩展 + 对于不同日期格式的处理不够精细 + [x] 实现networkx + 配置文件,构造图结构的有限自动机 + [x] 检测错误位置 + [x] 动态纠错 + [ ] 扩展性和灵活性 + [x] 扩展性:配置文件+源代码,后期开辟新的需求、业务等,需要建表,可以将新的命名规范添加到配置文件当中,源代码无需修改 + [ ] 灵活性:对配置文件进行curd即可修改规则。 + [x] 配置文件命名:settings + [?] 鲁棒性 + [x] 输入的字符串:字母数字下划线、空串如何处理: `r'[a-zA-Z0-9][a-zA-Z0-9_]+[a-zA-Z0-9]'` + [x] 常见的日期模式(字段、表名都可用) ```python def test_regex(self): # 正规式测试函数 patterns = [] pattern_1 = r'[a-z0-9][a-z0-9_]+[a-z0-9]' # 小写字母、字、下划线,并且不能以下划线开头和结尾 pattern_2 = r'[a|b]*[1-9]+[0-9]*[y|m|w|d]' # x年、月、日后(前) pattern_3 = r'[c|f|hf][y|q|m|w|d]' #自然年、财年 pattern_4 = r'[s|y|q|m|w|f]{1}td' #历史、年、季度、月、周财年截止到当前日 pattern_5 = r'[1-9]+[h|m|s]' #最近x小时、分钟、秒 # pattern_6 = r'[y|q|m|f]t[d]' #年、季度、月、财年截止到当日 pattern_7 = r'dt[Nm|h|r]' #零点截止到当前分钟、小时、当前时刻 pattern_8 = r'[h|m]tr' #小时、分钟截止到当前 pattern_9 = r'at[d|h|r]' # 活动开始截止到当前天、小时、当前间 pattern_10 = r'[rw|rm|ry|qh]' #上周四到本周三()报表周、刻钟 pattern_11 = r'[p|f][1-9][0-9]*t[1-9][0-9]*[d|w|m|y]' # 期f1t10y未来1到10年 pattern_12 = r'[p|f]*[1-9]+[0-9]*[d|w|m|y]' #f10d未来10天 # pattern = re.compile(r'{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}'format( # pattern_1, pattern_2, pattern_3, pattern_4,pattern_5, pattern_6, # pattern_7, pattern_8, pattern_9, pattern_10,pattern_11, # pattern_12)) # 拼接正规式 patterns = [ pattern_1, pattern_2, pattern_3, pattern_4, pattern_5,pattern_7, pattern_8, pattern_9, pattern_10, pattern_11,pattern_12 ] # 正规式列表 cases = [ 'adsa_9sadas_', '', '__', '000_0sad_', '__asdas','___dsadsa', '_sadas', 'sdasda_sadsad', 'sadads_12das', 'p12d','f12d', 'f12dt10d', 'std', 'ytd', 'p10d', 'f10dt11d', '1d','3d', '1w', '2w', '3m', '6m', 'b6m', 'a6m', 'cw', 'cm', 'cq','fy', 'hfy', 'std', 'ytd', 'qtd', 'mtd', 'wtd', 'ftd', '1h', '2w','dtNm', 'dth', 'dtr', 'htr', 'mtr', 'atd', 'ath', 'atr','p1w', 'p1m', 'rw', 'qh' ] #测试用例 for pattern in patterns: # 迭代测试 print("待测的正规式:{}".format(pattern)) pattern = re.compile(pattern) #print(pattern) for case in cases: # if pattern.fullmatch(case): # print("第{}个字符串{}符合规范。".format(casesindex(case), case)) if pattern.fullmatch(case): print("第{}个字符串{}不符合规范。".format(casesindex(case), case)) print( '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~' ) return ```