繁体   English   中英

使用非空白分隔符拆分字符串时如何删除虚假值

[英]How to remove falsy values when splitting a string with a non-whitespace separator

根据文档

str.split(sep=None, maxsplit=-1)

如果给出了sep ,则连续的分隔符不会组合在一起并被视为分隔空字符串(例如, '1,,2'.split(',')返回['1', '', '2'] )。 sep参数可能由多个字符组成(例如, '1<>2<>3'.split('<>')返回['1', '2', '3'] )。 用指定的分隔符拆分空字符串返回['']

如果sep未指定或为None ,则应用不同的拆分算法:连续空格的运行被视为单个分隔符,如果字符串具有前导或尾随空格,则结果将在开头或结尾不包含空字符串。 因此,拆分空字符串或仅由空格组成的字符串与None分隔符将返回[]

所以要使用关键字参数sep=以下是删除虚假项目的pythonic方法吗?

[w for w in s.strip().split(' ') if w]

如果它只是空格( \\s\\t\\n ), str.split()就足够了,但假设我们正在尝试拆分另一个字符/子字符串,则列表理解中的 if 条件是必要的。 那正确吗?

如果你想变得迟钝,你可以使用filter(None, x)来删除虚假项目:

>>> list(filter(None, '1,2,,3,'.split(',')))
['1', '2', '3']

可能不那么 Pythonic。 具体地迭代项目可能更清楚:

for w in '1,2,,3,'.split(','):
    if w:
        …

这清楚地表明您正在跳过空项目,而不依赖于 str.split 有时会跳过空项目的事实。

我会尽快使用正则表达式,或者跳过分隔符的连续运行(但要注意结尾):

>>> re.split(r',+', '1,2,,3,')
['1', '2', '3', '']

或查找所有不是分隔符的内容:

>>> re.findall(r'[^,]+', '1,2,,3,')
['1', '2', '3']

如果你想要去的Python的历史回来的路上,有两个独立的功能, splitsplitfields 我认为这个名字解释了目的。 第一个在任何空白处拆分,对任意文本输入有用,第二个在某些分隔输入上的行为可预测。 在 v1.6 之前,它们是用纯 Python 实现的。

好吧,我认为您可能只需要了解文档即可。 在您的示例中,您几乎展示了文档中提到的算法的差异。 不使用sep关键字参数或多或少就像使用sep=' '然后抛出空字符串。 当您连续有多个空格时,算法会拆分这些空格并找到None 因为您明确表示希望所有内容都被空格分割,所以它会将 None 转换为空字符串。 在这种情况下,将None更改为空字符串是一种很好的做法,因为它避免了更改函数的签名(或者换句话说函数返回的内容),在这种情况下它返回一个字符串列表。

下面显示了如何不同地处理具有 4 个空格的空字符串...

>>> empty = '   '
>>> s = 'this is   an   irritating string with  random spacing  .'
>>> empty.split()
[]
>>> empty.split(' ')
['', '', '', '']

对于您的问题,只需使用不带sep参数的split()

好吧,您的字符串 s = '这是一个带有随机间距的刺激性字符串。',其中包含多个空格,这就是为什么empty.split(' ')返回无用值的原因。

您必须从字符串 s 中删除多余的空格才能获得所需的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM