我有一个文本文件,其中包含一些格式:
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 :(得分: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