如何处理拆分中丢失的数据?

时间:2014-09-11 15:31:24

标签: python pattern-matching

我想拆分一个可能缺少部件的字符串。 例如,"foo-bar"应分为"foo""bar""zot"分为"zot"None

foo,bar = line.split('-',1)

适用于第一种情况,但不适用于第二种情况:

ValueError: need more than 1 value to unpack

当然,我可以走得很远:

foobar = line.split('-',1)
if len(foobar) == 2:
    foo,bar = foobar
else:
    foo,bar = foobar[0],None

但我想知道这是否是最“pythonic”的方式。

3 个答案:

答案 0 :(得分:3)

抓住例外:

try:
    foo, bar = line.split('-', 1)
except ValueError:
    # not enough values
    foo, bar = line, None

请注意,您需要拆分一次才能获得两个值,而不是两次。

答案 1 :(得分:2)

对于这个确切示例,我使用partition方法。

>>> 'foo-bar'.partition('-')
('foo', '-', 'bar')
>>> 'foobar'.partition('-')
('foobar', '', '')
>>> 'foo-bar-baz'.partition('-')
('foo', '-', 'bar-baz')

对于有多个分割,但仍然是已知数字的一般情况,我通常会检查split的结果长度,但Martijn(不出所料)正确地捕获异常很好,如果缺少分隔符的字符串不常见,则可能是更好的选择。

答案 2 :(得分:0)

使用列表理解:

i=['ff-bb','cc','dd-ss-vv']

[string+[None] if len(string)==1 else string for string in [x.split('-') for x in i]]

返回

 [['ff', 'bb'], ['cc', None], ['dd', 'ss', 'vv']]