Python中如何匹配Outputs后的多行Export:Name并替换格式?
解决方案
优先推荐:使用YAML解析库处理(更可靠)
直接用正则处理结构化YAML文档容易出现边界错误(比如嵌套结构、注释干扰等),推荐用PyYAML库来解析、修改再生成文档,步骤如下:
- 安装PyYAML:
pip install pyyaml
- 编写处理代码:
import yaml # 读取原始YAML内容 with open("your_file.yaml", "r") as f: yaml_data = yaml.safe_load(f) # 处理Outputs部分 if "Outputs" in yaml_data: for key, value in yaml_data["Outputs"].items(): if "Export" in value and "Name" in value["Export"]: # 添加ExportName字段并赋值 value["ExportName"] = value["Export"]["Name"] # 删除原有的Export层级 del value["Export"] # 写回修改后的YAML with open("modified_file.yaml", "w") as f: yaml.dump(yaml_data, f, default_flow_style=False, sort_keys=False)
这段代码会精准识别Outputs下的每个导出项,将Export.Name的值转移到ExportName字段,同时保留Description等其他字段不受影响。
正则方案(仅适合结构简单的场景)
如果一定要用正则,需要确保只匹配Outputs:之后的目标结构,并且全局替换所有匹配项,代码示例如下:
import re with open("your_file.yaml", "r") as f: content = f.read() # 定义替换逻辑:对Outputs后的内容批量替换Export-Name结构 def replace_export_blocks(match): return re.sub( r'\s*Export:\n\s*Name:\s*(.*?)(?=\n\s*\w+:|\Z)', r' ExportName: \1', match.group(0), flags=re.DOTALL ) # 定位Outputs后的内容并执行替换 modified_content = re.sub( r'(?<=Outputs:)(.*?)(?=\n\w+:|\Z)', replace_export_blocks, content, flags=re.DOTALL ) with open("modified_file.yaml", "w") as f: f.write(modified_content)
正则说明:
(?<=Outputs:)(.*?)(?=\n\w+:|\Z):精准捕获Outputs:之后到下一个顶级键或文档结尾的内容- 内部替换正则:匹配缩进的
Export:和下一行的Name:,捕获名称值后替换为ExportName: 原名称值
内容的提问来源于stack exchange,提问作者Josh Barton
相关产品推荐
相关产品推荐

