我有一个看起来像的文本文件:
text texttext texttext texttext texttext text
text texttext texttext texttext text
==========[start log]====
..
..
..
==============
testtextexttexttesttextexttext
testtextexttexttesttextexttext
==========[start log]====
..
..
..
==============
所以我想创建一个只有以下块的新文件:
==========[start log]===
..
..
..
=============
所有===
块下面都有2个空白行。
块内的...
实际上是文本。
答案 0 :(得分:3)
import re
regex = re.compile('==============.+?==============', re.DOTALL)
with open('in.txt', 'r') as f:
content = f.read()
matches = regex.findall(content)
答案 1 :(得分:3)
您可以逐行进行,只复制您想要的内容。
old = open('old.txt', 'r')
new = open('new.txt', 'w')
in_block = False
for line in old:
if line.startswith('===='):
in_block = not in_block # Oposite
new.write(line)
elif in_block:
new.write(line)
old.close()
new.close()
将它放在'new.txt'中。
==============
..
..
..
==============
==============
..
..
..
==============
答案 2 :(得分:0)
使用sed
非常容易:
sed -n '/==============/,/==============/p' example.txt
收率:
==============
..
..
..
==============
==============
..
..
..
==============
答案 3 :(得分:0)
从我的阅读中,我认为您不会试图将文字包含在' ===='
之外。raw = open(the_file).read()
parts = raw.split("=============")
new_parts = []
for ii, part in enumerate(parts):
if not (ii % 2): continue
new_parts.append(part)
new_raw = "=============".join(new_parts)
open(new_file, 'w').write(new_raw)
答案 4 :(得分:0)
我的偏好是使用生成器来处理块之前的材料与块内的材料之间的“状态变化”。
你真的在阅读一个头尾序列。头是(文字,'=== ......',更多文字,'=== ......')。尾巴是头尾序列。定义是尾递归,允许我们将其展平为循环
def gen_block_sequence( some_source ):
block_iter= tier(some_source):
for line in block_iter:
if line == '==============':
block= list( gen_head(block_iter)
yield block
def gen_head( block_iter ):
for line in block_iter:
if line == '==============':
break
yield line
虽然这很长,但我发现它可以很好地适应大量额外的处理和决策。