我有一个看起来像这样的 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')))
