2017-04-06 47 views
0

我跟着這個答案的(Python: Split by 1 or more occurrences of a delimiter)方向到一個T,它不斷,所以我想知道如果這是簡單的東西我失蹤或如果我需要一個新的方法來解決這個問題。Python - 溢出()在很多空間

我有以下.eml文件:

enter image description here

我的目標是最終解析出所有的魚類及其相應的權重數量,但對於一個測試,我只是用下面的代碼:

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()與錯誤

失敗

它告訴我Python失敗了,因爲它試圖在太多空間上分割,對吧?還是我誤解了這個?我想從這個過程中得到兩個值:魚的名稱(一個包含多個空格之前的所有文本的字符串)和數量(輸入行右側的整數)。

任何幫助,將不勝感激。

+0

你是正確的。 'line.split()'產生'['GB','Haddock','West','22572']'這當然不能被解壓到2個名字中。 – Vallentin

+0

哦,好的。那麼有沒有辦法直接回答這個鏈接用戶的問題?我可以在連續的幾個空格處​​專門分割()嗎? – theprowler

+0

你能舉一個例子來說明'魚'和'餘數'是什麼? – Vallentin

回答

2

您可以使用下面的正則表達式分裂

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

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

我想fishGB Haddock Westremainder22572

你可以做一些線這樣的:

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

而不是使用split()你可以利用rindex()找到最後的空間並在那裏分割。

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

雙方將輸出:

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

是......你可以在多個空格分開。但是,除非您可以指定空格的數量,否則您會在中間獲得額外的空白字段,就像您現在正在獲取的那樣。例如:

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 

請問解決喲你的問題?

1

在@此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