在Python中,我该如何按照一个或多个分隔符来进行分割?

50

我有一个来自日志文件的格式化字符串,它看起来像:

>>> a="test                            result"

也就是说,测试和结果之间被一些空格分隔开来 - 这可能是使用格式化字符串创建的,它给test一些固定的间距。

简单的拆分无法完成此任务:

>>> a.split(" ")
['test', '', '', '', ... '', '', '', '', '', '', '', '', '', '', '', 'result']

split(DELIMITER, COUNT) 清除了一些不必要的值:

>>> a.split(" ",1)
['test', '                           result']
这很有帮助 - 不过,当然,我真正需要的是:
['test', 'result']
我可以使用 split() 后跟 map + strip(),但我想知道是否有更Pythonic的方法来做到这一点。
谢谢,
Adam
更新: 如此简单的解决方案!谢谢大家。
6个回答

86

只需要不使用任何分隔符吗?

>>> a="test                            result"
>>> a.split()
['test', 'result']

18
关于为什么这个方法可行:a.split(None) 是 Python 中的一个特殊用法,表示“使用一个或多个空格字符作为分隔符进行拆分”。而 re.split() 是一种通用解决方案。 - Gregg Lind
1
需要使用 str.split(None, maxsplit) 因为该函数不接受关键字参数。我想知道为什么。 - tbrittoborges
2
问题是如何使用分隔符+(一个或多个)进行拆分。您的回答是说任何空格都将被视为分隔符,这不是正确的答案。 - Risinek

49
>>> import re
>>> a="test                            result"
>>> re.split(" +",a)
['test', 'result']

>>> a.split()
['test', 'result']

1
很棒。可能有助于其他非空格分隔符。 - Adam Matan
1
re.split('\W+',mystring) 更等同于 string.split(None)。 - Gregg Lind
10
这是对实际请求“按分隔符的一个或多个出现拆分”的唯一回答。 - Mark E. Haase
1
这应该被接受作为答案...其他的回答没有回答真正的问题... - Risinek
如果字符串以空格结尾,re.split()会给我一个额外的标记。 - BarathVutukuri
@BarathVutukuri 这是 split 函数的正确行为。如果输入序列以分隔符结尾,则在该分隔符之后会有一个空项。Java 处理此情况的方式与众不同,API 文档明确指出当未应用项限制时,它会丢弃尾部空项(但不会丢弃前导空项)。Python、Javascript 和 C# 不会丢弃尾随项。 - theferrit32

23

只需要这样就可以了:

a.split()

例子:

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

来自文档

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


4

使用简单的a.split()有什么问题吗?


2
问题是如何使用分隔符+(一个或多个)进行拆分。您的回答是说任何空格都将被视为分隔符,这不是正确的答案。 - Risinek

3

如果您想根据一个或多个定界符的出现进行拆分,并且不仅仅是依靠默认的 split() 方法,以匹配您的用例,那么您可以使用正则表达式来匹配定界符。以下代码将使用一个或多个 . 作为定界符:

s = 'a.b....c......d.ef...g'
sp = re.compile('\.+').split(s)
print(sp)

这将会给出:

['a', 'b', 'c', 'd', 'ef', 'g']

1

我再提供一种方法,对于分隔符不是空格的情况更有用,s.split()将无法使用。

例如:str = "Python,is,,more,,,,,flexible"。

In [27]: s = "Python,is,,more,,,,,flexible"

In [28]: str_list = list(filter(lambda x: len(x) > 0, s.split(",")))

In [29]: str_list
Out[29]: ['Python', 'is', 'more', 'flexible']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接