Python 3.6中依据末尾标识拆分固定长度数据的实现问询
嘿,我来帮你搞定这个自定义拆分的需求!你的核心诉求是根据字符串末尾的数字控制位,确定后续拆分段的长度,剩下的部分作为第一个分段对吧?我给你写适配Python 3.6的代码,刚好对应你给出的两个场景:
第一个场景:双控制位拆分
先看你给出的第一个数据案例:
原数据:
222059197200416183337238196597343056416183222059912541862093636789125421282596750423078310829482863204293488304933659144461174262663604792739522189599125439054724306338050390547164
拆分规则:末尾两位64分别控制d3(长度6)、d4(长度4),剩余部分为d1
实现代码
# 第一个案例的数据 data = "222059197200416183337238196597343056416183222059912541862093636789125421282596750423078310829482863204293488304933659144461174262663604792739522189599125439054724306338050390547164" # 提取末尾两位控制位,转成整数 control_d3 = int(data[-2]) # 对应数字6 control_d4 = int(data[-1]) # 对应数字4 # 用负索引定位各分段的截取范围(Python 3.6完全支持负索引) total_control_len = 2 # 控制位总长度 d4_end = -total_control_len d4_start = d4_end - control_d4 d3_end = d4_start d3_start = d3_end - control_d3 # 截取各分段 d1 = data[:d3_start] d3 = data[d3_start:d3_end] d4 = data[d4_start:d4_end] # 验证结果 print("d1:", d1) print("d3长度:", len(d3), "内容:", d3) print("d4长度:", len(d4), "内容:", d4)
代码说明
我特意用了Python的负索引来处理从末尾倒推的场景,比计算正索引更直观,而且完全适配Python 3.6版本。运行后得到的结果和你要求的完全一致:d3长度6,d4长度4,剩下的全部归为d1。
第二个场景:单控制位拆分
再看第二个字符串案例:
原数据:
cc32b326560de95d0fba47b5ad9072418f15caca4c39c2fe4db7003f4b8f81a79
拆分规则:末尾一位9控制x1的长度(9),剩余部分为x
实现代码
# 第二个案例的数据 data2 = "cc32b326560de95d0fba47b5ad9072418f15caca4c39c2fe4db7003f4b8f81a79" # 提取末尾一位控制位 control_x1 = int(data2[-1]) # 对应数字9 # 计算截取范围 total_control_len = 1 x1_end = -total_control_len x1_start = x1_end - control_x1 # 截取分段 x = data2[:x1_start] x1 = data2[x1_start:x1_end] # 验证结果 print("x:", x) print("x1长度:", len(x1), "内容:", x1)
代码说明
逻辑和第一个案例完全一致,只是控制位变成了1位,调整控制位总长度和索引即可,同样在Python 3.6的Spyder环境里可以直接运行。
通用化优化(可选)
如果以后有更多控制位的场景,你可以把这个逻辑封装成一个可复用的函数,比如:
def custom_split(s, control_bit_count, segment_indexes): """ 自定义字符串拆分函数 :param s: 待拆分的字符串 :param control_bit_count: 末尾控制位的数量 :param segment_indexes: 控制位对应的分段顺序(比如[0,1]表示第0位控制第一个分段,第1位控制第二个) :return: 拆分后的分段列表,第一个元素是剩余部分,后面是按规则拆分的分段 """ control_bits = s[-control_bit_count:] segment_lengths = [int(c) for c in control_bits] assert len(segment_lengths) == len(segment_indexes), "控制位数量和分段顺序不匹配" current_end = -control_bit_count segments = [] # 倒序截取分段,最后反转回来 for idx in reversed(segment_indexes): length = segment_lengths[idx] current_start = current_end - length segments.append(s[current_start:current_end]) current_end = current_start segments.append(s[:current_end]) return segments[::-1] # 用第一个案例测试 d1, d3, d4 = custom_split(data, 2, [0,1]) # 用第二个案例测试 x, x1 = custom_split(data2, 1, [0])
这个函数可以适配任意数量的控制位,你可以根据自己的需求调整参数~
内容的提问来源于stack exchange,提问作者honey

