2012-03-12 16 views
1

我有一個文本文件,我希望使用正則表達式匹配單詞PATTERN並提取STARTEND(文本文件如下所示)之間的文本。我不想直接匹配STARTEND字段,因爲我在該部分有隨機數據,但PATTERN保持不變,所以我可以很容易地匹配這一點。我有一個快速和骯髒的Python腳本,可以匹配模式,但我堅持下一步。從Python中的文本文件中讀取正則表達式的文件的片段

HERE IS MY PATTERN: 


     IGNORE SECTION 

************************************************** 
START 1 2 3 4 5 
    .  . . . . . 
    .  . . . . . 
    .  . . . . . 
END  . . . . . 



TEXT FILE CONTINUES........... 
. 
. 
. 
. 

************************************************** 

我怎麼告訴Python 的線條圖案下方5日線看,並停在第一個空行讀取時?

這裏是我的腳本:

#!usr/bin/env python 

import re 

pattern = r'PATTERN:'+'$' 

count = 0 
fp = open('fileinput.txt') 
for line in fp: 
    count += 1 

    match = re.search(pattern,line) 
    if match: 
     print 'Matched text:', line, 'Line', count 
     line_match = count 

new_line = line_match+4 

我標誌着我想要的線,但不能告訴Python開始從這個角度上讀取文件,當它擊中一個空行退出。有小費嗎?

+0

'nt'變量在那裏沒用。 – rubik 2012-03-12 14:25:10

+0

在提取所需數據之前,您是否必須讀取整個文件?看起來,解決方案可能是在''line_match = count''break'之後跳出循環。 – ChrisP 2012-03-12 14:37:07

+0

@ChrisP我需要讀取整個文件至少一次才能匹配正則表達式,對吧?一旦我得到一場比賽,我想下面5行,繼續閱讀,直到NEXT空行。所以在這種情況下,我應該在「START」和「END」之間得到文本。 – prrao 2012-03-12 14:40:25

回答

2

我不認爲你真的需要一個正則表達式的一切,你可以只使用endswith。以下是我將如何實施它。它不是可擴展的,但你想要做什麼:

matching = False 
found = [] 
with open('fileinput.txt', 'r') as file 
    it = iter(file) 
    for line in it: 
     if matching: 
      if line.strip() == '': 
       break 
      else: 
       found.append(line) 
     elif line.endswith('PATTERN:'): 
      for _ in range(6): 
       next(it) 
      matching = True 

既然你知道START發生5線PATTERN後有沒有必要進行搜索,所以不是我用assert,以確保它是在預期的位置。匹配的行被存儲到found,並且您可以很好地打印它們。

for line in found: 
    print line 
+0

如果我每次都有'START'和'END',這種方法非常棒。實際數據中,我實際上在這些位置有隨機浮動。在這個例子中,我剛剛使用了'START'和'END'來使得我的問題更容易。 我只想匹配'PATTERN'並直接看下面5行,而不執行任何檢查。然後,從「START」行開始,我想繼續閱讀,直到我點擊「END」下面的空行。 – prrao 2012-03-12 15:06:17

+0

有沒有什麼方法可以使用'for line in file'並讓Python從一個特定的行開始讀取?我可以很容易地使用'readlines()[startline:endline]',但是當我點擊空行時,我無法指定一個'break'。這就是我被卡住的地方 – prrao 2012-03-12 15:06:26

+1

沒有意識到START和END只是佔位符 - 我已經更新了答案,所以它現在應該可以工作。然而,當你搜索'PATTERN'時,python需要在這個時候讀取文件,所以你並沒有試圖告訴它從哪裏開始。 – aquavitae 2012-03-12 15:16:35

0

我沒有很好地解釋你的解釋;從我能夠理解的,你需要:

1)從特定模式讀取文件,直到空行;
2)將讀取的部分與多行模式匹配。

要做到這一點:

1)閱讀感興趣的所有文字到一個單一變量,readline()readlines()xreadlines()for line in file - 無論是最方便的。
請注意,for line if file循環可隨時停止,並且breakxreadlines() - 只是停止讀取。下一次他們被調用時,他們將從文件中的當前位置開始。
2)將它與包含\n的模式匹配或使用re.M標誌,如果您需要.來匹配換行符。

for l in f: 
    if re.match("PATTERN:\n",l): break 
s="" 
for l in f: 
    if l=='\n': break 
    s+=l 
m=re.match("<whatever-pattern-matches-your-chunk-of-text>",s) 
+0

我不知道'for line in file'方法在下一次被調用時從同一行繼續。那很棒。無論如何,無論如何開始直接閱讀5行以下的文件,而不必指定新的正則表達式? – prrao 2012-03-12 15:00:34

+0

'對於範圍(5)中的i:s + = f.readline()''從'f'中的當前位置正好讀入5行到's'中。如果您需要*跳過* 5行,請在不保存任何結果的情況下閱讀它們。 (想一想:你*有*要讀取數據以查看第5行結尾在哪個位置,不是嗎?)) – 2012-03-12 15:06:24

+0

由於某種原因,上面顯示的for循環不起作用。我收到以下錯誤: 'ValueError:混合迭代和讀取方法會丟失數據' 是否與更高版本的Python有關?我正在使用v2.7 – prrao 2012-03-12 15:24:07

相關問題