Skip to main content
 首页 » 编程设计

python之正则表达式以匹配 YAML 中的键

2024年08月19日49oomusou

我有一个看起来像这样的 yaml..!用户可以定义 N 个 xyz_flovor_id,其中 _flovor_id 键将是通用的。目的是获取 *_flavor_id 键并从中提取值。

  server: 
    tenant: "admin" 
    availability_zone: "nova" 
    cpu_overcommit_ratio: 1:1 
    memory_overcommit_ratio: 1:1 
    xyz_flovor_id: 1 
    abc_flavor_id: 2 

我能够计算出匹配 _flovor_id 的正则表达式。然而,当试图在代码中使用它时,它会抛出错误。 这是我的代码。

def get_flavor_keys(params): 
    pattern = re.compile(r'[^*]flavor_id') 
    for key, value in params.iteritems(): 
        print value 
        if key == 'server': 
            if pattern.match(value): 
                print 'test' 

print value 正在转储整个 YAML 文件(预期)。之后立即回溯。

Traceback (most recent call last): 
  File "resource_meter.py", line 150, in <module> 
    get_flavor_keys(items) 
  File "resource_meter.py", line 15, in get_flavor_keys 
    if pattern.match(value): 
TypeError: expected string or buffer 

请您参考如下方法:

你需要这个正则表达式。我将其分组为键值对:

^\s*(?P<key>\w+_flavor_id):\s*(?P<value>\d+) 

Python 演示:https://repl.it/Lk5W/0

import re 
 
regex = r"^\s*(?P<key>\w+_flavor_id):\s*(?P<value>\d+)" 
 
test_str = ("  server:\n" 
    "    tenant: \"admin\"\n" 
    "    availability_zone: \"nova\"\n" 
    "    cpu_overcommit_ratio: 1:1\n" 
    "    memory_overcommit_ratio: 1:1\n" 
    "    xyz_flavor_id: 1\n" 
    "    abc_flavor_id: 2\n") 
 
matches = re.finditer(regex, test_str, re.MULTILINE) 
 
for matchNum, match in enumerate(matches): 
    print ("{key}:{value}".format(key = match.group('key'), value=match.group('value')))