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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:15:50