缩进文本解析为特定结构字典的实现及代码完善求助
搞定嵌套文本转指定字典的代码完善方案
嘿,我看了你这段解析文本生成字典的代码,目前的逻辑确实有点小问题,比如重复键的处理、最后一组内容的遗漏,还有变量跟踪的逻辑不太顺。我帮你调整了代码,完全符合你要的结构需求,一起来看看:
完整代码实现
import re import pprint text = ''' test1: aaa: aaa test2: bbb:bbb test3: ccc:ccc eee:eee test2: ddd:ddd ''' parsed = {} current_key = None current_lines = [] # 遍历所有行,跳过空行避免干扰 for line in text.splitlines(): line = line.rstrip('\n') if not line.strip(): continue leading_whitespaces = len(line) - len(line.lstrip()) # 识别无前置空格的键行(符合小写字母/下划线开头的规则) if leading_whitespaces == 0 and re.match(r'^[a-z_]', line): # 如果之前有正在处理的键,先把收集好的子行存入字典 if current_key is not None: if current_key in parsed: # 重复键就追加新的子行列表 parsed[current_key].append(current_lines.copy()) else: # 新键就创建对应的列表存储子行 parsed[current_key] = [current_lines.copy()] # 清空当前子行列表,准备收集新键的内容 current_lines.clear() # 更新当前处理的键 current_key = line.split(':')[0] else: # 子行直接加入当前收集列表 current_lines.append(line) # 处理最后一个键的剩余子行(循环结束后不会自动处理) if current_key is not None and current_lines: if current_key in parsed: parsed[current_key].append(current_lines.copy()) else: parsed[current_key] = [current_lines.copy()] # 打印结果验证 pprint.pprint(parsed)
代码逻辑说明
- 变量跟踪:用
current_key记录当前正在处理的键,current_lines收集该键下的所有子行,避免了原代码中prev_proj的混乱逻辑。 - 重复键处理:当遇到重复键时,会把新的子行列表追加到对应键的列表中,而不是覆盖原有内容。
- 空行过滤:跳过文本中的空行,避免无效内容干扰解析。
- 收尾处理:循环结束后专门处理最后一个键的子行,防止遗漏最后一组内容。
运行这段代码后,得到的结果完全符合你要的结构:
{ 'test1': [[' aaa: aaa']], 'test2': [[' bbb:bbb'], [' ddd:ddd']], 'test3': [[' ccc:ccc', ' eee:eee']] }
(注:你给出的目标字典里多了一个"test"键,应该是笔误,这段代码会严格按照输入文本生成对应结果)
内容的提问来源于stack exchange,提问作者pikk
相关产品推荐
相关产品推荐

