python拆分而不创建空白

时间:2013-07-09 07:10:49

标签: python string split

我理解为什么使用拆分创建空白非常重要,感谢this question,但有时候不必抓住它们。

假设你解析了一些css并获得了以下字符串:

s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
s2 = 'color:#000;background-color:#fff;border:1px #333 dotted'

两者都是有效的css,即使字符串末尾缺少分号。拆分字符串时,您会得到以下内容:

>>> s1.split(';')
['background-color:#000', 'color:#fff', 'border:1px #ccc dotted', '']
>>> s2.split(';')
['color:#000', 'background-color:#fff', 'border:1px #333 dotted']

额外的分号在列表中创建一个空白项目。现在,如果我想进一步操作,我需要测试每个列表的开头和结尾,如果它们是空白则删除它们,这不是那么糟糕,但似乎可以避免。

的问题:

是否存在与split基本相同但不包含尾随空白项的方法?或者只是一种方法来删除那些就像字符串strip删除尾随空格

3 个答案:

答案 0 :(得分:7)

只需使用None过滤器删除项目:

filter(None, s1.split(';'))

演示:

>>> s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
>>> filter(None, s1.split(';'))
['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']

使用filter()调用None会删除所有'空'或数字0项;在布尔上下文中评估为false的任何内容。

filter(None, ....)吃早餐的清单:

>>> import timeit
>>> timeit.timeit('filter(None, a)', "a = [1, 2, 3, None, 4, 'five', ''] * 100")
9.410392045974731
>>> timeit.timeit('[i for i in a if i]', "a = [1, 2, 3, None, 4, 'five', ''] * 100")
44.9318630695343

答案 1 :(得分:6)

您可以使用列表推导来过滤掉空字符串,因为空字符串被视为False

>>> s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
>>> [i for i in s1.split(';') if i]
['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']

或者,您可以先rstrip()分号:

>>> s1.rstrip(';').split(';')
['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']

答案 2 :(得分:1)

在执行str.strip之前将split应用于字符串:

>>> s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
...     
>>> s1.strip(';').split(';')
['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']

适用于前导';'

>>> s1 = ';background-color:#000;color:#fff;border:1px #ccc dotted;'
>>> s1.strip(';').split(';')
['background-color:#000', 'color:#fff', 'border:1px #ccc dotted']

我不确定为什么你会想要避免这种情况,因为拆分之前的速度会比LCfilter更快:

>>> s1 = ';background-color:#000;color:#fff;border:1px #ccc dotted;'*1000
>>> %timeit filter(None, s1.split(';'))
1000 loops, best of 3: 638 us per loop
>>> %timeit s1.strip(';').split(';')
1000 loops, best of 3: 570 us per loop
>>> %timeit [i for i in s1.split(';') if i]
100 loops, best of 3: 931 us per loop