【问题标题】:How to collapse consecutive delimiters?如何折叠连续的分隔符?
【发布时间】:2011-09-22 15:48:37
【问题描述】:

Python 中默认的split 方法将连续的空格视为单个分隔符。但是如果你指定一个分隔符字符串,连续的分隔符不会折叠:

>>> 'aaa'.split('a')
['', '', '', '']

折叠连续分隔符最直接的方法是什么?我知道我可以从结果列表中删除空字符串:

>>> result = 'aaa'.split('a')
>>> result
['', '', '', '']
>>> result = [item for item in result if item]

但是有没有更方便的方法呢?

【问题讨论】:

  • 看来你可以用re.split完成这个
  • 有趣!我没有意识到 split() 没有参数做了一些 split 无法复制的事情。

标签: python string split


【解决方案1】:

这是尽可能简洁:

string = 'aaa'
result = [s for s in string.split('a') if s]

或者你可以切换到正则表达式:

string = 'aaa'
result = re.split('a+', string)

【讨论】:

  • 很好的解决方案!模式a+ 将尽可能被最连续的a 分割。因此,通过运行re.split('a+',string),它将返回['','']。说string = 'baaac' 然后它会返回['b','c']
  • 我把它再放一个以去除任何人工制品:s = [s2 for s2 in [s.strip() for s in linkObj.getText().split(' ') if s] if s2]
【解决方案2】:

您可以使用re.split 和正则表达式作为分隔符,如:

re.split(pattern, string[, maxsplit=0, flags=0])

【讨论】:

    【解决方案3】:

    你可以使用正则表达式:

    re.split(pattern, string[, maxsplit=0, flags=0])
    

    作为

    re.split('a+', 'aaa')
    

    【讨论】:

    【解决方案4】:

    我认为您的解决方案完全可以。这是一个等效的:

    filter(bool, 'aaa'.split('a'))
    

    不过,可能不如列表推导式那么明显。

    【讨论】:

    • 抱歉,这个解决方案很糟糕。此外,过滤器在 python3 中更改并且不会有相同的结果
    • 你能详细说明它为什么不好(除了我不知道它在 python 3 中的行为发生了变化)吗?
    • 因为你添加了对 bool 的函数调用(开销)并使其可读性降低。
    • filter 在 Python 3 中返回一个迭代器(与列表相反)——它使用更少的内存。
    • @Franklin 我明确提到它的可读性可能不如列表理解,但我明白关于开销的重点。感谢您指出这一点。
    【解决方案5】:

    不,没有更方便的方法。要么编写自己的拆分函数,要么删除空字符串。

    但是您的解决方案似乎非常清晰和 pythonic。

    【讨论】:

      【解决方案6】:

      虽然它不完全符合您的要求,但您可以使用 set 删除所有非唯一令牌:

      >>> result
      ['', '', '']
      >>> set(result)
      set([''])
      

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 1970-01-01
        • 2018-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 2020-12-14
        • 2016-07-07
        相关资源
        最近更新 更多