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
相关产品推荐
相关产品推荐

