2014-12-07 147 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)