2014-12-30 99 views
-1

編輯: 最後我找了解決方案,我是的「重複」的問題,並起草下面的代碼片段:Python的類似scanf輸入

import sys 
from collections import deque 

_input=deque([]) 

def read_word(): 
    global _input 
    while len(_input)==0: 
     line=sys.stdin.readline().split() 
     for word in line: 
      _input.append(word) 
    return _input.popleft() 

def read_int(): 
    return int(read_word()) 

原題:

我想寫一些讀取Python中stdin輸入的程序。但輸入處理正在讓我失望 - 我沒有看到一種很好的方式來掃描線條中不完美的數據。 例如,如果我必須掃描的整數N,然後N個字要處理,在C++中我會做這樣的:

int N; 
char str[100]; 
scanf("%d",&N); 
for(int i=0;i<N;i++){ 
    scanf("%s",str); 
    //do stuff with str 
} 

這一方案將掃描所有的以下輸入的完全相同的方式:

//input 1: 
3 word1 word2 word3 
//input 2: 
3 
word1 word2 word3 
//input 3: 
3 
word1 
word2 
word3 
//input 4: 
3 word1 word2 
word3 

我喜歡C類scanf給我的靈活性,我也希望在Python中看到類似的東西。我不能使用input(),因爲它會嘗試將字符串解析爲Python語法(可能以字典或類似的方式結束),而raw_input()則以換行符結尾的行進行操作。函數sys.stdin.read()也不好,因爲它會一直等待,直到給出整個輸入(並且我可能想要實時顯示部分結果)。我看到實現這種功能的唯一方法是在循環中使用sys.stdin.readline(),試圖獨立解析每一行,直到解析所有需要的單詞。但這不是一個很好的解決方案,它也有一些缺陷 - 例如,如果上面提到的示例程序在其進一步操作中應該輸入一個更多的東西,並且這個詞或數字與最後一個詞在同一行中給出, Python程序不會正確解析它。

有問題的投入將是:

//input 5: 
3 word1 word2 
word3 next_input 

單詞「next_input」將被「吞噬」通過的ReadLine()函數,即使它可能是由程序以後需要。同樣,這可以通過提供input_yet_to_be_parsed_but_already_inputted的臨時緩衝區來解決,但它很快會變成非常有問題的代碼。有沒有真正的「pythonic」方式來做到這一點?還是我錯過了明顯的東西?

+0

「在C++中我會做這樣的」 - 這不是C++ ...這是C. – user530873

+0

OK,但在C++中有'CIN >> A >> B;'語法,無論如何,它掃描只是一次一個字,所以問題保持有效。 – akrasuski1

回答

0

爲什麼不在正則表達式中使用re模塊?

你的榜樣將被映射到這樣的正則表達式:

>>> pattern = re.compile(r'^(\d)*') 
>>> pattern.match('3 word1').group(1) 
'3' 

如果需要供以後使用數據的其餘部分,如何抓住它作爲第二個gorup?

>>> pattern = re.compile(r'^(\d)*(.*)') 
>>> match = pattern.match('3 lol') 
>>> "matched: " + match.group(1) + ", rest: " + match.group(2) 
'matched: 3, rest: lol' 
+1

好的,但你如何從標準輸入首先得到輸入?我希望你特別解決最後一個問題(輸入5) – akrasuski1

+0

@ akrasuski1,參見編輯,正則表達式可能會變得更復雜,因爲輸入獲得更多的copmlex,但我記得'scanf'也具有該屬性。您可以通過最後匹配來訪問數據的「休息」。 –

+0

'pattern.match('3 word1')。group(1)'返回字符串''3'',它與scanf(「%d」,&N);''從stdin中讀取並存儲整數值變成整數變量'N'。 – martineau