【问题标题】:Python - spilt() over many spacesPython - 在许多空间上拆分()
【发布时间】:2017-04-06 17:15:58
【问题描述】:

我按照这个答案 (Python: Split by 1 or more occurrences of a delimiter) 的指示找到了一个 T,但它一直在失败,所以我想知道这是不是我遗漏了一些简单的东西,或者我是否需要一种新方法来解决这个问题。

我有以下 .eml 文件:

我的目标是最终解析出所有鱼类种群及其相应的重量,但我只是使用以下代码进行测试:

with open(file_path) as f:
    for line in f:
        if ("Haddock" in line):
            #fish, remainder = re.split(" +", line)
            fish, remainder = line.split()
            print(line.lower().strip())
            print("fish:", fish)
            print("remainder:", remainder)

它在fish, remainder = line.split() 行失败并出现错误

ValueError: too many values to unpack (expected 2)

这告诉我 Python 失败了,因为它试图分割太多的空间,对吧?还是我对此有误解?我想从这个过程中得到两个值:鱼的名称(包含许多空格之前的所有文本的字符串)和数量(输入行右侧的整数)。

任何帮助将不胜感激。

【问题讨论】:

  • 你是对的。 line.split() 的结果是 ['GB', 'Haddock', 'West', '22572'] 当然不能解压成 2 个名称。
  • 哦,好的。那么有没有办法直接回答链接用户的问题?我可以split() 专门连续几个空格吗?
  • 您能举例说明fishremainder 是什么吗?
  • 对,我不是很清楚。在过去的案例(电子邮件)中,他们通常会列出鱼、重量和价格;所以第一个split()会产生一个fish和一个remainder,然后我会split()remainder产生一个重量和价格。在这种情况下,我希望 fishGB Haddock Westremainder22572

标签: python split


【解决方案1】:

您可以使用下面的正则表达式进行拆分

fish, remainder = re.split(r'(?<=\w)\s+(?=\d)',line.strip())

it will split and give `['GB Haddock West', '22572']`

【讨论】:

    【解决方案2】:

    我希望fish 成为GB Haddock Westremainder 成为22572

    你可以这样做:

    s = line.split()
    fish, remainder = " ".join(s[:-1]), s[-1]
    

    您可以使用rindex(),而不是使用split(),并找到最后一个空格并在它们之间分割。

    at = line.rindex(" ")
    fish, remainder = line[:at], line[at+1:]
    

    两者都会输出:

    print(fish) # GB Haddock West  
    print(remainder) # 22572
    

    【讨论】:

      【解决方案3】:

      是的...您可以在多个空格上拆分。但是,除非您可以指定空格数,否则您将在中间获得额外的空字段,就像您现在获得的一样。例如:

      in_stuff = [
          "GB Haddock West          22572",
          "GB Cod West               7207",
          "GB Haddock East           3776"
      ]
      
      for line in in_stuff:
          print line.split("   ")
      

      输出:

      ['GB Haddock West', '', '', ' 22572']
      ['GB Cod West', '', '', '', '', '7207']
      ['GB Haddock East', '', '', '  3776']
      

      然而,一个简单的改变就会得到你想要的:从中挑选出第一个和最后一个字段:

      for line in in_stuff:
          fields = line.split("   ")
          print fields[0], int(fields[-1])
      

      输出:

      GB Haddock West 22572
      GB Cod West 7207
      GB Haddock East 3776
      

      这能解决你的问题吗?

      【讨论】:

        【解决方案4】:

        以@Vallentin 的回答为基础,但使用 Python 3 的扩展解包功能:

        In [8]: line = "GB Haddock West 22572"
        
        In [9]: *fish, remainder = line.split()
        
        In [10]: print(" ".join(fish))
        GB Haddock West
        
        In [11]: print(int(remainder))
        22572
        

        【讨论】:

          猜你喜欢
          • 2021-01-23
          • 1970-01-01
          • 2014-02-15
          • 1970-01-01
          • 1970-01-01
          • 2018-03-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多