从Python中的列表中删除字符

时间:2015-06-05 15:45:25

标签: python regex

所以我正在尝试打印出我们实验室中的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)

我知道这可能是非常业余的代码,但我不是真正的蟒蛇人。是否有某种正则表达式或我可以用来清理它的东西?

3 个答案:

答案 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)

您正在寻找的功能是maphttps://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返回字符串的后半部分(您感兴趣的部分),假设除了您识别的内容之外,字符串中没有空格。