在python中查找两个字符串之间的数据

时间:2014-12-07 23:11:34

标签: python regex python-2.7 text-files

我有一个文本文件,其中包含一些格式:

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))

如果有人能指导我如何实施它会很棒。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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