假设我在文本文件中包含此数据,该脚本将提取index1和index2之间的所有内容,并在输出文件中包含这些字符串。但由于某种原因,它会在index2之前停止几行。
哑数据
index1 0000
随机数据
index1 0000
随机数据
index1 0000
index2 0000
这是我的代码;它一看到index1就开始写入我的输出文件,但如果它看到index2,它应该写下最后一个匹配并退出。但它永远不会退出,它似乎挂起并在index2之前停止几行,但总是在同一条线上。如果数据不敏感,我会粘贴实际数据。
import re
myvar = False
myfile = open('extract','w')
with open('input.txt') as f:
for line in f:
if re.search(r'index1', line):
myvar = True
myfile.write(line)
elif re.search(r'index2', line):
myvar = False
break
elif myvar == True:
myfile.write(line)
continue
myfile.close
f.close
问题是,它适用于我的虚拟数据,但不适用于真实数据,它会在此行停止。它从表单提要开始,但我可能会搞砸它,但在此之前有多个表单提要打印到输出文件。
在日期时间第50页的FF(编辑)空白空白(编辑)日期时间
谢谢。
答案 0 :(得分:1)
在我们讨论之后......
您可以通过从re.search
切换到re.findall
来简单地编写代码,消除循环并消除错误原因。这将产生一个列表 - 技术上是一个元组 - 包含所有匹配。
如果您想消除重复项,可以将列表转移到set
,这是一个没有重复项的无序列表。
您还应该以与输入文件相同的方式将输出文件包装在上下文管理器(with open
)中。这样可以更好地正确关闭文件。
如果你想对集合采取行动,你可以循环遍历它,就好像它是一个列表,或者如果你只需要一个元素(例如,用于测试代码的下一部分),你可以转换到列表 - list(j)[0]
import re
output = []
with open("extract.txt", 'w') as myfile:
with open("input2.txt", 'r') as f:
output = re.findall(r'index1.*?index3',f.read(), re.DOTALL)
j = set(output)
for x in j:
myfile.write(x + '\n')
使用单个元素,它将更改为:
with open("extract.txt", 'w') as myfile:
with open("input2.txt", 'r') as f:
output = re.findall(r'index1.*?index3',f.read(), re.DOTALL)
myfile.write(list(set(output))[0] + '\n')