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

2024-05-18 05:37:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下格式的文本文件:

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

我需要得到两个关键字之间的所有行,并将其保存为文本文件。到目前为止,我遇到了以下情况。但是我对single quotes有一个问题,因为正则表达式认为它是表达式中的引号而不是关键字。在

目前我的代码:

^{pr2}$

如果有人能指导我如何实施,那就太好了。。在


Tags: 代码表达式格式linepage情况关键字引号
2条回答

如果您担心的是单引号,可以用双引号开始正则表达式字符串。。。在

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

现在,这里还有更多的问题。。。即使声明为r,您仍然必须在.compile(请参见What does the "r" in pythons re.compile(r' pattern flags') mean?)中转义正则表达式的反斜杠,因为没有r,您可能需要更多的反斜杠。在

我创建了一个包含两个“部分”的测试文件:

^{pr2}$

下面的代码可以满足您的需要(我认为)

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

正如@JoanCharmant指出的,没有必要为此任务使用regex,因为记录是由固定字符串分隔的。在

这样的话就足够了:

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)

相关问题 更多 >