2017-10-11 32 views
0

我正在嘗試掃描輸入文件並打印出以某個字符串開頭的部分行。該文本文件是10000多行,但我只關心起始行,更具體地說是該行內的數據。澄清,這裏有兩行代碼解釋了我想說的。打印出以兩個不同的字符串輸出開頭的行嗎?

inst "N69" "IOB",placed BIOB_X11Y0 R8 , 

inst "n0975" "SLICEX",placed CLEXL_X20Y5 SLICE_X32Y5 , 

這裏是我得到迄今代碼:

searchfile = open("C:\PATH\TO\FILE.txt","r") 
for line in searchfile: 
    if "inst " in line: 
     print line 
searchfile.close() 

現在,這是巨大的,如果我在尋找與「出師表」開始的所有行,但我專門找以「inst」N「」或「inst」n「」開頭的行。從那裏,我想只提取以N或n開頭的字符串。

我的想法是首先將這些行(如上所示)提取到一個新的.txt文件,然後運行另一個腳本以僅獲取具有N或n的行的部分。在上面的例子中,我只關心N69和n0975。有沒有更簡單的方法來做到這一點?

+0

爲什麼你覺得你需要兩個腳本和一箇中間文件?你可以在第二個腳本中做任何事情,你可以在第一個腳本中執行(在if中)。 – jasonharper

+0

抱歉@jasonharper我的Python知識有點生疏,想不到另一種方法。不要讓我開始對我的正則表達式完全缺乏瞭解... –

回答

1

隨着re.search()功能:

樣品file.txt內容:

inst "N69" "IOB",placed BIOB_X11Y0 R8 , 
some text 
inst "n0975" "SLICEX",placed CLEXL_X20Y5 SLICE_X32Y5 , 
text 
another text 

import re 

with open('file.txt', 'r') as f: 
    for l in f.read().splitlines(): 
     m = re.search(r'^inst "([Nn][^"]+)"', l) 
     if m: 
      print(m.group(1)) 

輸出:

N69 
n0975 
+0

但如何刪除n或N值 –

+0

@nice_remark後面的多餘數據,請參閱我的更新 – RomanPerekhrest

+0

試圖將其寫入文本文件時,數據不會像您的代碼輸出一樣逐行列出。會添加'file.write(m.group(1))'這一行嗎? –

1

是與re MOD ULE。

re.finditer(r'^inst\s+\"n(\d+)\"', the_whole_file, re.I) 

會返回所有匹配的迭代器。 對於每場比賽,你需要做.group(1)來獲得你想要的數字。

請注意,您不需要使用此方法首先過濾文件。你可以爲整個文件做這個。

在你的情況下的輸出將是:

69 
0975 
0

這裏是一個解決方案:

with open('nfile.txt','r') as f: 
    for line in f: 
     if line.startswith('inst "n') or line.startswith('inst "N'): 
      print line.split()[1] 

對於文件startswith部分檢查每個線路如果線路與目標patters中的一個開始。如果是,則使用split拆分該行並打印第二個組件,該組件是nN的零件。

相關問題