字母数字组合标识的连续区间合并技术需求问询
合并连续前缀标识的实现方案
我们有一批由字母前缀加数字组成的标识(格式如A1、AA1、A01、AA01),需要将列表中同前缀且数字连续的标识合并成「前缀首数字-尾数字」的格式,非连续或单条的保持原样。比如输入:
lst = ['RB11', 'RB12', 'A08', 'A09', 'A10', 'SN13', 'A1', 'A2', 'A3', 'A4']
期望输出:
['RB11-12','A08-10','SN13','A1-4']
实现思路
- 拆分每个标识的字母前缀和数字部分,同时保留数字的原始格式(比如A08的数字是
08而非8)。 - 遍历列表,把同前缀且数字连续的标识归为一组,遇到前缀不同或数字不连续的情况就开启新组。
- 对每个组进行格式化:单条标识直接保留,多条连续的则拼接成「前缀+起始数字-结束数字」的形式。
代码实现
import re def merge_continuous_ids(lst): if not lst: return [] result = [] # 初始化第一个组的信息 first_match = re.match(r'([A-Za-z]+)(\d+)', lst[0]) current_prefix = first_match.group(1) current_start_num_str = first_match.group(2) current_end_num = int(current_start_num_str) current_end_num_str = current_start_num_str for item in lst[1:]: match = re.match(r'([A-Za-z]+)(\d+)', item) prefix = match.group(1) num_str = match.group(2) num = int(num_str) # 判断是否属于当前连续组 if prefix == current_prefix and num == current_end_num + 1: current_end_num = num current_end_num_str = num_str else: # 处理当前组并加入结果 if current_start_num_str == current_end_num_str: result.append(f"{current_prefix}{current_start_num_str}") else: result.append(f"{current_prefix}{current_start_num_str}-{current_end_num_str}") # 切换到新组 current_prefix = prefix current_start_num_str = num_str current_end_num = num current_end_num_str = num_str # 处理最后一个组 if current_start_num_str == current_end_num_str: result.append(f"{current_prefix}{current_start_num_str}") else: result.append(f"{current_prefix}{current_start_num_str}-{current_end_num_str}") return result # 测试示例 test_lst = ['RB11', 'RB12', 'A08', 'A09', 'A10', 'SN13', 'A1', 'A2', 'A3', 'A4'] print(merge_continuous_ids(test_lst)) # 输出: ['RB11-12', 'A08-10', 'SN13', 'A1-4']
关键点说明
- 正则表达式
([A-Za-z]+)(\d+)可以精准拆分任意长度的字母前缀和数字部分,兼容大小写字母(如果需要严格小写或大写,可调整正则为([a-z]+)(\d+)或([A-Z]+)(\d+))。 - 同时跟踪数字的字符串形式和整数形式:整数用于判断连续性,字符串用于保留原始格式(比如带前导零的数字不会被格式化丢失)。
- 遍历过程中实时处理完成的组,最后单独处理循环结束后剩余的最后一组,避免遗漏。
内容的提问来源于stack exchange,提问作者Stella H
相关产品推荐
相关产品推荐

