Python优雅实现带索引字符串结构映射的技术问询
解决带索引的键字符串映射问题
先明确下问题场景:
我们有一个预定义的键映射规则:
"key1:key2[]:key3[]:key4"→"newKey1[]:newKey2[]:newKey3"。现在需要实现一个方法,当输入带具体索引的字符串(比如"key1:key2[2]:key3[3]:key4")时,能返回对应的新键字符串"newKey1[2]:newKey2[3]:newKey3",核心要求是方括号内的数字顺序必须和输入里的保持一致。
我整理了一个完整的实现方案,思路清晰且能满足需求:
实现思路
- 从输入字符串里提取所有方括号内的索引值,按出现顺序保存
- 将输入字符串转换成预定义映射里的模板格式(把具体索引替换成
[]),找到对应的目标模板 - 把目标模板里的
[]占位符,按顺序替换成之前提取到的索引值
完整代码实现
import re # 预定义的键映射模板,key是原始模板,value是目标模板 predefined_mapping = {"key1:key2[]:key3[]:key4": "newKey1[]:newKey2[]:newKey3"} def transform(input_key): # 1. 提取输入中所有方括号内的数字索引,按顺序存储 indexes = re.findall(r'\[(\d+)\]', input_key) # 2. 将输入转换为模板格式,匹配预定义映射 template_key = re.sub(r'\[\d+\]', '[]', input_key) if template_key not in predefined_mapping: raise ValueError(f"找不到对应映射的键模板: {template_key}") target_template = predefined_mapping[template_key] # 3. 按顺序替换目标模板中的[]占位符 index_iterator = iter(indexes) # 用lambda表达式每次取一个索引替换[] result = re.sub(r'\[\]', lambda match: f"[{next(index_iterator)}]", target_template) return result # 测试示例 test_input = "key1:key2[2]:key3[3]:key4" print(transform(test_input)) # 输出结果: newKey1[2]:newKey2[3]:newKey3
代码关键点解释
- 索引提取:
re.findall(r'\[(\d+)\]', input_key)会精准匹配所有[数字]格式的内容,只提取数字部分,得到的列表顺序和输入中索引出现的顺序完全一致 - 模板匹配:通过
re.sub(r'\[\d+\]', '[]', input_key)把输入里的具体索引替换成[],这样就能和预定义映射里的键完全匹配,找到对应的目标模板 - 占位符替换:用迭代器来逐个取出索引,配合
re.sub的回调函数,确保每个[]都被按顺序替换成输入里的索引,完美保持顺序一致性
内容的提问来源于stack exchange,提问作者void
相关产品推荐
相关产品推荐

