43

我想只在至少有两个或更多空格的地方拆分一个字符串。

例如

str = '10DEUTSCH        GGS Neue Heide 25-27     Wahn-Heide   -1      -1'
print str.split()

结果:

['10DEUTSCH', 'GGS', 'Neue', 'Heide', '25-27', 'Wahn-Heide', '-1', '-1']

我希望它看起来像这样:

['10DEUTSCH', 'GGS Neue Heide 25-27', 'Wahn-Heide', '-1', '-1']
4

4 回答 4

76
In [4]: import re    
In [5]: text = '10DEUTSCH        GGS Neue Heide 25-27     Wahn-Heide   -1      -1'
In [7]: re.split(r'\s{2,}', text)
Out[7]: ['10DEUTSCH', 'GGS Neue Heide 25-27', 'Wahn-Heide', '-1', '-1']

更新 2021+ 答案。

str.split现在接受正则表达式进行拆分。

在这里阅读更多

row = '10DEUTSCH        GGS Neue Heide 25-27     Wahn-Heide   -1      -1'
df = pd.DataFrame({'string' : row},index=[0])

print(df)
                                              string
0  10DEUTSCH        GGS Neue Heide 25-27     Wahn...

df1 = df['string'].str.split('\s{2,}',expand=True)
print(df1)

           0                     1           2   3   4
0  10DEUTSCH  GGS Neue Heide 25-27  Wahn-Heide  -1  -1
于 2012-10-12T20:30:20.823 回答
9

正如已经指出的那样,str这不是您的字符串的好名称,因此请words改用:

output = [s.strip() for s in words.split('  ') if s]

.split(' ') - 带有两个空格 - 将为您提供一个列表,其中包含空字符串和带有尾随/前导空格的项目。列表推导遍历该列表,保留所有非空白项 ( if s),并且 .strip() 处理任何前导/尾随空格。

于 2012-10-12T20:33:41.837 回答
5
In [30]: strs='10DEUTSCH        GGS Neue Heide 25-27     Wahn-Heide   -1      -1'

In [38]: filter(None, strs.split("  "))

Out[38]: ['10DEUTSCH', 'GGS Neue Heide 25-27', ' Wahn-Heide', ' -1', '-1']

In [32]: map(str.strip, filter(None, strs.split("  ")))

Out[32]: ['10DEUTSCH', 'GGS Neue Heide 25-27', 'Wahn-Heide', '-1', '-1']

对于 python 3,将结果filtermapwith包装起来list以强制迭代。

于 2012-10-12T20:33:43.377 回答
1

如果是:

  • 混合制表符和空格
  • 字符串开头和/或结尾处的空格

(最初回答Split string at whitespace 比单个空格和制表符长, Python

我会用正则表达式拆分:2个或更多空格,然后过滤掉re.split产生的空字符串:

import re

s = '        1. 1. 2.     1 \tNote#EvE\t \t1\t \tE3\t \t  64\t        1. 3. 2. 120 \n'

result = [x for x in re.split("\s{2,}",s) if x]

print(result)

印刷:

['1. 1. 2.', '1', 'Note#EvE', '1', 'E3', '64', '1. 3. 2. 120']

这不会保留前导/尾随空格,但它很接近。

于 2020-04-05T23:03:06.133 回答