¿Cómo leer un archivo y extraer datos entre patrones multilínea?

Tengo un archivo del que necesito extraer un dato, delimitado por (posiblemente) patrones fijos multilínea

some data ... [my opening pattern is here and can be multiline] the data I want to extract [my ending pattern which can be multiline as well] ... more data 

Estos patrones se fijan en el sentido de que el contenido es siempre el mismo, excepto que puede incluir nuevas líneas entre las palabras.

La solución sería simple si tuviera la seguridad de que mi patrón tendrá un formato predecible, pero no lo tengo.

¿Hay alguna manera de hacer coincidir estos “patrones” con una secuencia?

Hay una pregunta que es casi duplicada y las respuestas apuntan a amortiguar la entrada. La diferencia en mi caso es que conozco cadenas exactas en el patrón, excepto que posiblemente las palabras también estén delimitadas por una nueva línea (por lo que no es necesario \w* tipo de coincidencias)

¿Estás buscando esto?

 >>> import re >>> data = """ ... some data ... [my opening pattern ... is here ... and can be multiline] the data ... I want to extract [my ending ... pattern which can be ... multiline as well] ... more data ... """ >>> re.findall('\[[^]]*\]\s+([^[]+)\s+\[[^]]+\]', data) ['the data \nI want to extract'] 

ACTUALIZACIÓN Para leer un archivo grande en trozos, sugiero el siguiente enfoque:

 ## The following was modified based on ChrisA's code in ## http://www.gossamer-threads.com/lists/python/python/1242366. ## Titled " How to read from a file to an arbitrary delimiter efficiently?" import re class ChunkIter: def __init__(self, f, delim): """ f: file object delim: regex pattern""" self.f = f self.delim = re.compile(delim) self.buffer = '' self.part = '' # the string to return def read_to_delim(self): """Return characters up to the last delim, or None if at EOF""" while "delimiter not found": b = self.f.read(256) if not b: # if EOF self.part = None break # Continue reading to buffer self.buffer += b # Try regex split the buffer string parts = self.delim.split(self.buffer) # If pattern is found if parts[:-1]: # Retrieve the string up to the last delim self.part = ''.join(parts[:-1]) # Reset buffer string self.buffer = parts[-1] break return self.part if __name__ == '__main__': with open('input.txt', 'r') as f: chunk = ChunkIter(f, '(\[[^]]*\]\s+(?:[^[]+)\s+\[[^]]+\])') while chunk.read_to_delim(): print re.findall('\[[^]]*\]\s+([^[]+)\s+\[[^]]+\]', chunk.part) print 'job done.'