ruamel.yaml 会为以 [ 开头的字符串(如正则表达式)自动添加单引号以确保 YAML 解析正确性;这不是格式缺陷,而是语法安全机制——所有符合规范的 YAML 解析器都能无损还原该字符串。
ruamel.yaml 会为以 `[` 开头的字符串(如正则表达式)自动添加单引号以确保 yaml 解析正确性;这不是格式缺陷,而是语法安全机制——所有符合规范的 yaml 解析器都能无损还原该字符串。
YAML 规范要求:当字符串以特殊字符(如 [, {, ], }, ,, #, : 等)开头或包含可能引发解析歧义的结构时,必须使用引号包裹,否则会导致解析失败或语义错误。你的正则模式 "[a-zA-Z0-9.-_\u4e00-\u9fa5]+" 以 [ 起始,YAML 将其识别为流式序列(flow sequence)的开始标记,因此 ruamel.yaml 主动添加单引号,确保该值被严格解析为字符串而非空列表或语法错误。
✅ 正确理解:加引号不是“多余格式化”,而是必要且标准的 YAML 行为。以下示例验证其可靠性:
from ruamel.yaml import YAML
yaml = YAML()
data = {"pattern": "[a-z]+\d{3}"}
# 写入带引号的 YAML(自动行为)
with open("test.yaml", "w", encoding="utf-8") as f:
yaml.dump(data, f)
# 读取验证:引号被自动剥离,还原为原始字符串
with open("test.yaml", "r", encoding="utf-8") as f:
loaded = yaml.load(f)
print(repr(loaded["pattern"])) # 输出: '[a-z]+\d{3}'(字符串本身不含引号)
⚠️ 注意事项:
- 切勿强行移除引号(如通过 default_style='|' 或自定义 representer),这可能导致 YAML 解析失败(例如 yaml.scanner.ScannerError);
- 若需多行正则,可改用字面量块标量(|)提升可读性,但首行仍需缩进且不以 [ 直接开头;
- 中文 Unicode 范围 u4e00-u9fa5 在 YAML 中完全合法,引号不影响其编码与解析。
? 总结:'[a-zA-Z0-9.-_\u4e00-\u9fa5]+' 是符合 YAML 标准、安全可逆的表示形式。只要遵循标准解析流程(即用 ruamel.yaml.load() 读取),引号不会影响运行时字符串内容——它只是序列化的保护层,而非数据污染。











