You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

缩进文本解析为特定结构字典的实现及代码完善求助

搞定嵌套文本转指定字典的代码完善方案

嘿,我看了你这段解析文本生成字典的代码,目前的逻辑确实有点小问题,比如重复键的处理、最后一组内容的遗漏,还有变量跟踪的逻辑不太顺。我帮你调整了代码,完全符合你要的结构需求,一起来看看:

完整代码实现

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)

代码逻辑说明

  1. 变量跟踪:用current_key记录当前正在处理的键,current_lines收集该键下的所有子行,避免了原代码中prev_proj的混乱逻辑。
  2. 重复键处理:当遇到重复键时,会把新的子行列表追加到对应键的列表中,而不是覆盖原有内容。
  3. 空行过滤:跳过文本中的空行,避免无效内容干扰解析。
  4. 收尾处理:循环结束后专门处理最后一个键的子行,防止遗漏最后一组内容。

运行这段代码后,得到的结果完全符合你要的结构:

{
    'test1': [['  aaa: aaa']],
    'test2': [['  bbb:bbb'], ['  ddd:ddd']],
    'test3': [['  ccc:ccc', '  eee:eee']]
}

(注:你给出的目标字典里多了一个"test"键,应该是笔误,这段代码会严格按照输入文本生成对应结果)

内容的提问来源于stack exchange,提问作者pikk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 21:03:12