在Python中解析Yaml:检测重复的密钥

Tk4*_*421 6 python regex yaml pyyaml

yamlpython中的库无法检测到重复的密钥.这是多年前报告过的一个错误,没有修复.

我想找到一个解决这个问题的好方法.创建一个regex返回所有键的可能性有多合理?然后很容易发现这个问题.

任何正则表达式大师都可以建议一个能够提取所有密钥以查找重复项的正则表达式吗?

文件示例:

mykey1:
    subkey1: value1
    subkey2: value2
    subkey3:
      - value 3.1
      - value 3.2
mykey2:
    subkey1: this is not duplicated
    subkey5: value5
    subkey5: duplicated!
    subkey6:
       subkey6.1: value6.1
       subkey6.2: valye6.2
Run Code Online (Sandbox Code Playgroud)

Adr*_*rgé 5

yamllint命令行工具,你想要做什么:

sudo pip install yamllint
Run Code Online (Sandbox Code Playgroud)

具体来说,它有一个规则key-duplicates来检测重复和密钥互相覆盖:

$ yamllint test.yaml
test.yaml
  1:1       warning  missing document start "---"  (document-start)
  10:5      error    duplication of key "subkey5" in mapping  (key-duplicates)
Run Code Online (Sandbox Code Playgroud)

(它还有许多其他规则可以启用/禁用或调整.)


Eri*_*ulz 5

覆盖加载器中的构建是一种更轻量级的方法:

 import yaml
 # special loader with duplicate key checking
 class UniqueKeyLoader(yaml.SafeLoader):
     def construct_mapping(self, node, deep=False):
         mapping = []
         for key_node, value_node in node.value:
             key = self.construct_object(key_node, deep=deep)
             assert key not in mapping
             mapping.append(key)
         return super().construct_mapping(node, deep)
Run Code Online (Sandbox Code Playgroud)

然后:

 yaml_text = open(filename), 'r').read()
 data[f] = yaml.load(yaml_text, Loader=UniqueKeyLoader)                  
Run Code Online (Sandbox Code Playgroud)