【问题标题】:python split a string with at least 2 whitespacespython拆分一个至少有2个空格的字符串
【发布时间】:2012-10-03 17:10:26
【问题描述】:

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

例如

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']

【问题讨论】:

    标签: python split python-2.7


    【解决方案1】:
    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 现在接受正则表达式进行拆分。

    阅读more here

    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
    

    【讨论】:

    • 无需使用正则表达式,只需执行str.split(' ')。另外请注意,由于内置的​​ str 类型,使用 str 作为变量名是一件坏事。
    • @Wessie:text.split(' ') 会产生大量空字符串,因为空格数通常大于 2。
    • str.split(' ') 结果为['10DEUTSCH', '', '', '', 'GGS Neue Heide 25-27', '', ' Wahn-Heide', ' -1', '', '', '-1']。正则表达式是分割“2 或更多个空格”的好方法。
    • @unutbu 希望你不介意编辑,很好的回答帮助了我:)
    【解决方案2】:

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

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

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

    【讨论】:

    • 我认为您还需要在其中抛出 .strip() 以防止 " -1" (请参阅@Ashwini 的解决方案)
    • map(lambda s: s.strip(), filter(None, words.split())) 可能是一个更快的替代方案,虽然不那么可读
    【解决方案3】:
    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,将filtermap 的结果用list 包裹起来以强制迭代。

    【讨论】:

      【解决方案4】:

      如果是:

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

      (原回复Split string at whitespace longer than a single space and tab characters, 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']
      

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

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 2019-11-29
        • 2015-08-18
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        相关资源
        最近更新 更多