2014-12-07 145 views
0

兩個字符串我有包含像一些格式的文本文件:查找數據中的中間蟒蛇

PAGE(leave) 'Data1' 
line 1 
line 2 
line 2 
... 
... 
... 
PAGE(enter) 'Data1' 

我需要把所有的線在這兩個關鍵字之間,並將其保存爲文本文件。到目前爲止,我已經遇到了以下內容。但是我有一個與single quotes有關的問題,因爲正則表達式認爲它是表達式中的引號而不是關鍵字。

我的代碼至今:

log_file = open('messages','r') 
    data = log_file.read() 
    block = re.compile(ur'PAGE\(leave\) \'Data1\'[\S ]+\s((?:(?![^\n]+PAGE\(enter\) \'Data1\').)*)', re.IGNORECASE | re.DOTALL) 
    data_in_home_block=re.findall(block, data) 
    file = 0 
    make_directory("home_to_home_data",1) 
    for line in data_in_home_block: 
     file = file + 1 
     with open("home_to_home_" + str(file) , "a") as data_in_home_to_home: 
      data_in_home_to_home.write(str(line)) 

這將是巨大的,如果有人能指導我如何實現它..

+0

因此這些文件實際上包含括號之前反斜線?像'\('? – BorrajaX 2014-12-07 23:55:19

+1

)爲什麼如果關鍵字不可變則使用正則表達式?只要查找它們,在文本中獲取它們的位置,然後檢索它們之間的內容。 – 2014-12-07 23:55:32

回答

0

如果是單引號什麼擔心你,你就可以開始了正則表達式字符串用雙引號...

'hello "howdy"' # Correct 
"hello 'howdy'" # Correct 

現在,有更多的問題在這裏...即使r聲明時,你仍然必須逃避你的正則表達式的.compile中的反斜槓(請參見What does the "r" in pythons re.compile(r' pattern flags') mean?)如果沒有r,那麼您可能需要更多反斜槓。

我創建了一個測試文件有兩個 「節」:

PAGE\(leave\) 'Data1' 
line 1 
line 2 
line 3 
PAGE\(enter\) 'Data1' 

PAGE\(leave\) 'Data1' 
line 4 
line 5 
line 6 
PAGE\(enter\) 'Data1' 

下面的代碼會做你想做的(我認爲)

import re 

log_file = open('test.txt', 'r') 
data = log_file.read() 
log_file.close() 
block = re.compile(
    ur"(PAGE\\\(leave\\\) 'Data1'\n)" 
    "(.*?)" 
    "(PAGE\\\(enter\\\) 'Data1')", 
    re.IGNORECASE | re.DOTALL | re.MULTILINE 
) 
data_in_home_block = [result[1] for result in re.findall(block, data)] 
for data_block in data_in_home_block: 
    print "Found data_block: %s" % (data_block,) 

輸出:

Found data_block: line 1 
line 2 
line 3 

Found data_block: line 4 
line 5 
line 6 
1

正如@JoanCharmant指出的那樣,這個任務沒有必要使用正則表達式,因爲記錄由固定字符串分隔。

像這樣的東西應該足夠:

messages = open('messages').read() 

blocks = [block.rpartition(r"PAGE\(enter\) 'Data1'")[0] 
      for block in messages.split(r"PAGE\(leave\) 'Data1'") 
      if block and not block.isspace()] 

for count, block in enumerate(blocks, 1): 
    with open('home_to_home_%d' % count, 'a') as stream: 
     stream.write(block)