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

Python基于正则表达式实现YAML文件转JSON功能的方案求助

YAML转JSON正则实现方案

明确适用范围:仅适配你提供的简单层级嵌套字典结构YAML,不支持YAML高级特性(列表、多行字符串、引用、多文档等)。

实现步骤

  • 第一步:预处理原始YAML内容,剔除所有空行,统一换行符
  • 第二步:用正则匹配每一行的缩进长度、键名、值
  • 第三步:跟踪缩进层级,动态补全JSON所需的大括号和逗号
  • 第四步:用正则对值做类型转换:布尔值转小写、数字保留原值、字符串加双引号

可运行实现代码

import re

def yaml_to_json(yaml_str):
    # 预处理:删除空行,过滤首尾空白
    lines = [line.rstrip() for line in yaml_str.splitlines() if line.strip()]
    json_parts = ['{']
    # 记录每一层的缩进值
    indent_stack = []
    # 正则匹配行格式:分组1是缩进空格,分组2是键名,分组3是值(如果存在)
    line_pattern = re.compile(r'^(\s*)(\w+):(.*)$')
    
    for idx, line in enumerate(lines):
        match = line_pattern.match(line)
        if not match:
            continue
        indent, key, value = match.groups()
        indent_len = len(indent)
        value = value.strip()
        
        # 处理层级变化:缩进减小则闭合上一层的大括号
        while indent_stack and indent_len <= indent_stack[-1]:
            json_parts.append(' ' * (len(indent_stack)*2) + '},')
            indent_stack.pop()
        
        # 有值的情况:普通键值对
        if value:
            # 处理值类型
            if value in ('True', 'False'):
                value = value.lower()
            elif not re.match(r'^\d+(\.\d+)?$', value):
                # 非数字字符串加双引号,转义内部双引号
                value = f'"{value.replace("\"", "\\\"")}"'
            json_parts.append(f'{" " * ((len(indent_stack)+1)*2)}"{key}": {value},')
        # 无值的情况:是父级键,需要开新对象
        else:
            json_parts.append(f'{" " * ((len(indent_stack)+1)*2)}"{key}": {{')
            indent_stack.append(indent_len)
    
    # 闭合所有剩余层级
    while indent_stack:
        json_parts.append(' ' * (len(indent_stack)*2) + '}')
        indent_stack.pop()
    json_parts.append('}')
    
    # 处理多余的最后一个逗号
    json_str = '\n'.join(json_parts).replace(',\n}', '\n}')
    return json_str

# 调用示例
if __name__ == '__main__':
    with open('saturday.yaml', 'r', encoding='utf-8') as f:
        yaml_content = f.read()
    json_content = yaml_to_json(yaml_content)
    with open('timetable.json', 'w', encoding='utf-8') as f:
        f.write(json_content)

注意事项

  • 你提供的测试YAML里subject2的缩进和subject1不一致,运行前需要先修正缩进,把subject2前面的空格调整到和subject1相同层级,否则层级判断会出错
  • 如果需要支持更复杂的YAML语法,正则方案的维护成本会指数级升高,生产环境还是推荐使用成熟的pyyaml库做转换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:45:03