python拆分而不创建空白

Rya*_*axe 0 python string split

我理解为什么使用拆分创建空白很重要,这要归功于这个问题,但有时候有必要不抓住它们.

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

s1 = 'background-color:#000;color:#fff;border:1px #ccc dotted;'
s2 = 'color:#000;background-color:#fff;border:1px #333 dotted'
Run Code Online (Sandbox Code Playgroud)

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

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

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

题:

是否有一个方法基本上相同split但不包括尾随空白项目?或者只是一种方法来删除那些就像字符串必须strip删除尾随空格

Mar*_*ers 8

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

filter(None, s1.split(';'))
Run Code Online (Sandbox Code Playgroud)

演示:

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

调用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
Run Code Online (Sandbox Code Playgroud)


Ter*_*ryA 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']
Run Code Online (Sandbox Code Playgroud)

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

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