所以我正在尝试打印出我们实验室中的VMWare模板列表。我希望输出看起来像这样:
vagrant-ubuntu12.04-small
vagrant-centos6.6-small
vagrant-ubuntu12.04
vagrant-centos6.6
而当前的输出看起来更像是这样:
['[datastore2] vagrant-ubuntu12.04-small']
['[datastore2] vagrant-centos6.6-small']
['[datastore1] vagrant-centos6.6']
['[datastore1] vagrant-ubuntu12.04']
这是我的代码:
from pysphere import VIServer
from pprint import pprint
VSPHERE = VIServer()
VSPHERE.connect('helike.labs.sdelements.com',
'xxxxxxxxx',
'xxxxxxxxx')
VMLIST = VSPHERE.get_registered_vms()
def is_template(string):
""" Is it a template? """
if string.find(".vmtx") == -1:
return False
else:
return True
def is_vagrant_template(string):
""" Is it a Vagrant Template? """
if string.find("vagrant") == -1:
return False
else:
return True
def is_proper_template(string):
""" filter out extraneous templates """
if string.find("sde") == -1:
return True
else:
return False
temp1 = filter(is_template, VMLIST)
temp2 = filter(is_vagrant_template, temp1)
temp3 = filter(is_proper_template, temp2)
for item in temp3:
relist = item.split('/')[:1]
pprint(relist)
我知道这可能是非常业余的代码,但我不是真正的蟒蛇人。是否有某种正则表达式或我可以用来清理它的东西?
答案 0 :(得分:6)
如果它始终是相同的格式,只需在空格上拆分一次并提取第二个元素:
data = [['[datastore2] vagrant-ubuntu12.04-small'],
['[datastore2] vagrant-centos6.6-small'],
['[datastore1] vagrant-centos6.6'],
['[datastore1] vagrant-ubuntu12.04']]
for sub in data:
print(sub[0].split(None,1)[1])
vagrant-ubuntu12.04-small
vagrant-centos6.6-small
vagrant-centos6.6
vagrant-ubuntu12.04
在将数据放入列表之前,您可能也可以进行拆分,但是没有看到实际输入,这是不可能确定的。
答案 1 :(得分:1)
一个简单的正则表达式可以做到这一点,提供一些灵活性
可以将捕获组1捕获到一个数组中,
或者只是全局查找并替换为捕获组1
如果您不知道所有可能的字符,只需替换
[a-z\d.-]+
与\S+
(?mi)^\['\[[^\]]*\]\h+([a-z\d.-]+)\h*'\]
(?mi) # Modes: Multi-line, No-Case
^ # BOL
\[' \[ [^\]]* \]
\h+
( [a-z\d.-]+ ) # (1)
\h*
'\]
答案 2 :(得分:0)
您正在寻找的功能是map
:
https://docs.python.org/2/library/functions.html#map
您想要做的是在map
之后致电filter
,如下所示:
def is_proper_vagrant_template(string):
""" Is it a proper Vagrant template? """
return ".vmtx" in string and "vagrant" in string and "sde" not in string
def clean_template(string):
""" Return the second half of the string, assuming whitespace as a separator """
return string.split()[1]
temp1 = filter(is_proper_vagrant_template, VMLIST)
clean = map(clean_template, temp1)
在上面的代码片段中,filter
的工作方式与之前的方式相同,只是我重新编写了将三个函数合并为一个的调用。 map
函数接受筛选列表并在每个元素上调用clean_template
,将结果作为列表返回。
clean_template
返回字符串的后半部分(您感兴趣的部分),假设除了您识别的内容之外,字符串中没有空格。