17

我有以下python代码:

def split_arg(argv):
    buildDescriptor = argv[1]
    buildfile, target = buildDescriptor.split("#")

    return buildfile, target

它需要一个字符串 ( argv[1])buildfile#target并将它们拆分为两个同名的变量。因此,像“ my-buildfile#some-target ”这样的字符串将分别分解为my-buildfilesome-target

但有时,不会有“#”和目标;有时你只会有“ my-buildfile ”,在这种情况下,我只希望目标是“”(空)。

如何修改此函数,以便它处理“#”不存在的实例并返回带有空目标的构建文件?

目前,如果我只传递构建文件,它会引发错误:

buildfile, target = buildDescriptor.split("#")
ValueError: need more than 1 value to unpack

提前致谢!

4

4 回答 4

17

我会使用明显的方法:

    buildfile, target = buildDescriptor.split("#") if \
                        "#" in buildDescriptor else \
                        (buildDescriptor, "")

请注意,当 buildDescriptor 中有多个“#”时,这也会引发异常(这通常是一件好事!)

于 2012-10-14T23:01:51.580 回答
10

首先,将拆分的结果放在一个列表中:

split_build_descriptor = buildDescriptor.split("#")

然后检查它有多少元素:

if len(split_build_descriptor) == 1:
    buildfile = split_build_descriptor[0]
    target = ''
elif len(split_build_descriptor) == 2:
    buildfile, target = split_build_descriptor
else:
    pass  # handle error; there's two #s
于 2012-10-14T22:59:14.467 回答
8
>>> buildfile, _, target = "hello#world".partition("#")
>>> buildfile, target
('hello', 'world')
>>> buildfile, _, target = "hello".partition("#")
>>> buildfile, target
('hello', '')
于 2012-10-15T00:46:14.863 回答
1

您可以在 Python 3 中执行此操作:

input_string = 'this is a test'
delimiter = '#'

slots = input_string.split(delimiter)
if slots[0] == input_string:
  print('no %s found' % delimiter)
else:
  print('%s found right after \"%s\"' % (delimiter, slots[0]))
于 2019-05-03T18:55:23.003 回答