我是这个世界的新手,我需要用这种文件来做这件事:
......|4751|...
.
.
.
. . . 99999|
并复制所有行和带有字符串"|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.findall
与re.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']