复制两个字符串之间的所有行,这些行不在行 python 的开头



我是这个世界的新手,我需要用这种文件来做这件事:


......|4751|...

.
.
.
. . . 99999|

我想搜索这个字符串"|4751|">

并复制所有行和带有字符串"|4751|"的行,直到包含 99999|

文本具有倍数"|4751|"和99999| 我想复制所有行之间的所有行

这在python上可能吗?我在这里找到了一些帖子,但问题是我无法改编脚本,因为我的字符串 |4751|位于行的中间,而不是在行的开头。

我们可以构建一个自定义迭代器(和上下文管理器(,从输入文件中检索所需的行

class Collector:
def __init__(self, filename, start_marker, stop_marker):
self.toggle_collect = False
self.f = open(filename)
self.m1 = start_marker
self.m2 = stop_marker
def __enter__ (self):
return self
def __exit__ (self, exc_type, exc_value, traceback):
self.f.close()
def __iter__(self):
return self
def __next__(self):
while True:
r = next(self.f)
if self.m1 in r:  # found the start-collecting marker
self.toggle_collect = True
elif self.m2 in r:  # found the stop-collecting marker
self.toggle_collect = False
continue
if self.toggle_collect:  # we are collecting
return r.rstrip()  # collect row

with Collector('file_rows.txt', '4751', '99999') as c:
for r in c:
print(r)

其中,输入文件

foobar0
foo|4751|bar1
foobar2
foo99999|bar3
foobar4
foobar5
foo|4751|bar6
foo99999|bar7
foobar8

生产

foo|4751|bar1
foobar2
foo|4751|bar6

备注:正如您在输出中看到的,行以空行隔开。这是因为它们包括回车。

如果不需要,我们可以将其剥离

if self.toggle_collect:  # we are collecting
return r.rstrip()  # provide row

如果我们想要列表中的行,只需从迭代器创建一个

with Collector('file_rows.txt', '4751', '99999') as c:
results = list(c)

您可以将re.findallre.MULTILINE|re.DOTALL标志一起使用,并展望。请务必转义|字符,这些字符在正则表达式中具有特殊含义:

import re
haystack = """foobar0
foo|4751|bar1
foobar2
foo99999|bar3
foobar4
foobar5
foo|4751|bar6
foo99999|bar7
foobar8"""
needle = "^[^n]*|4751|.*?(?=99999|)"
result = re.findall(needle, haystack, re.MULTILINE|re.DOTALL)
print (result)

这导致:

['foo|4751|bar1nfoobar2nfoo', 'foo|4751|bar6nfoo']

相关内容

  • 没有找到相关文章

最新更新