Python精确子串匹配替换及嵌套字符串转JSON/YAML报错解决
解决方案
步骤1:清理字符串并解决精确匹配问题
原始字符串存在多余单引号嵌套,且直接用.replace()会出现部分匹配错误,我们用正则单词边界\b实现精确匹配,同时清理无效单引号:
import re import json import yaml # 原始输入字符串 dit = "'{p_d: '{a:3, what:3.6864e-05, s:lion, vec_mode:'{2.5, -2.9, 3.4, 5.6, -8.9, -5.67, 2, 2, 2, 2, 5.4, 2, 2, 6.545, 2, 2}, sst:'{c:-20, b:6, p:panther}}}" # 1. 清理所有多余单引号 clean_str = dit.replace("'", "") # 2. 过滤目标列表中的非空元素 target_list = ['', 'p_d', '', '', 'a', '3', '', 'what', '3.6864e-05', '', 's', 'lion', '', 'sst', '', 'c', '-20', '', 'b', '6', '', 'p', 'panther', '', '', ''] non_empty_items = [item for item in target_list if item] # 3. 精确匹配替换为带双引号的格式 # 使用\b确保完整单词匹配,避免拆分p_d这类标识符 for item in non_empty_items: escaped_item = re.escape(item) clean_str = re.sub(rf'\b{escaped_item}\b', f'"{item}"', clean_str)
步骤2:将集合转为数组(适配JSON/YAML规范)
JSON不支持无键值对的集合{...},需要将其转为数组[...]:
# 匹配{后紧跟数字/负号的集合,替换为数组开头[ clean_str = re.sub(r'\{(\s*-?\d[\d.e-]*\s*,)', r'[\1', clean_str) # 匹配, 数字}的集合结尾,替换为数组结尾] clean_str = re.sub(r'(\s*-?\d[\d.e-]*\s*)\}', r'\1]', clean_str)
步骤3:解析为字典并输出指定格式YAML
现在字符串已符合JSON规范,可直接解析后转为块样式YAML:
# 解析为Python字典 data = json.loads(clean_str) # 输出YAML,禁用流样式,保留原始键顺序 yaml_output = yaml.dump(data, default_flow_style=False, sort_keys=False) print(yaml_output)
最终输出结果
p_d: a: "3" what: "3.6864e-05" s: "lion" vec_mode: - 2.5 - -2.9 - 3.4 - 5.6 - -8.9 - -5.67 - 2 - 2 - 2 - 2 - 5.4 - 2 - 2 - 6.545 - 2 - 2 sst: c: "-20" b: "6" p: "panther"
内容的提问来源于stack exchange,提问作者Vimo
相关产品推荐
相关产品推荐

