我正在寻找一种使用Boto3模仿AWS CLI EC2过滤器的方法 假设我想翻译describe-instances命令的过滤器部分:
aws ec2 describe-instances --filters "Name=instance-
type,Values=m1.small,t2.small"
进入Boto3 describe_instances方法:
response = client.describe_instances(
Filters=[
{
'Name': 'instance- type',
'Values': [
'm1.small','t2.small',
]
}
]
)
所以基本上我要问的是,为什么在python中采取字符串有什么好处:
"Name=instance-type,Values=m1.small,t2.small"
并将其转换为:
[
{
'Name': 'instance- type',
'Values': [
'm1.small','t2.small',
]
}
]
这样我就可以在boto3的decribe_instances方法中将它用作过滤器参数。
答案 0 :(得分:0)
以下内容将与给定的确切格式相匹配,但如果格式变化太大,则会遇到问题:
import re
filter='Name=instance-type,Values=m1.small,t2.small'
match = re.search('(.*)=(.*),(.*)=(.*)', filter)
f = {match.group(1) : match.group(2), match.group(3) : match.group(4).split(',')}
# f is a normal Python dictionary
print (f)
# Or, convert it to JSON
import json
print (json.dumps(f))
输出是:
{'Values': ['m1.small', 't2.small'], 'Name': 'instance-type'}
{"Values": ["m1.small", "t2.small"], "Name": "instance-type"}
订单对字典无关紧要。您也可以将输出包装在'[]'中,但这使得它不是严格的JSON。
一个测试Python正则表达式的好网站:Pythex
答案 1 :(得分:0)
对于过滤器具有分开的多部分的情况; 因为“名称”和“值”特定于此过滤器
def parse_filter_field(filter_str):
filters = []
regex = re.compile(r'name=([\w\d_:.-]+),values=([/\w\d_,.\*]+)', flags=re.I)
for f in filter_str.split(';'):
match = regex.match(f)
if match is None:
print 'could not parse filter: %s' % (f, )
continue
filters.append({
'Name' : match.group(1),
'Values' : match.group(2).split(',')
})
return filters