Если вы уверены, что не будет никаких перекрывающихся разделов, вы можете использовать что-то вроде:
lineno = 0
needed = [3, 12, 14, 15] # This may need adjusting to allow for lineno running from 1
found_at = None
for line in open('filename.txt').readlines(): # This will read blocks of lines for speed
lineno += 1 # Human readable line numbers
if found_at:
if (lineno - found_at) in needed:
print(lineno, line)
elif (lineno - found_at) > max(needed):
found_at = None
elif text in line:
found_at = lineno
Вы также можете использовать сложное регулярное выражение, но, вероятно, не стоит времени построить один и будет намного менее ясным.