Python Regex - Extrae texto entre (múltiples) expresiones en un archivo de texto

Soy un principiante de Python y estaría muy agradecido si pudiera ayudarme con mi problema de extracción de texto.

Quiero extraer todo el texto, que se encuentra entre dos expresiones en un archivo de texto (el principio y el final de una letra). Para ambos, al principio y al final de la letra, hay varias expresiones posibles (definidas en las listas "letter_begin" y "letter_end", por ejemplo, "Estimado", "a nuestro", etc.). Quiero analizar esto en busca de un montón de archivos, encuentre a continuación un ejemplo de cómo se ve dicho archivo de texto -> Quiero extraer todo el texto comenzando desde "Estimado" hasta "Douglas". En los casos en que "letter_end" no tiene coincidencia, es decir, no se encuentra la expresión letter_end, la salida debe comenzar desde letter_beginning y finalizar al final del archivo de texto a analizar.

Edit: el final del "texto grabado" debe ser posterior a la coincidencia de "letter_end" y antes de la primera línea con 20 caracteres o más (como es el caso de "Texto aleatorio aquí también" -> len = 24. @

"""Some random text here
 
Dear Shareholders We
are pleased to provide you with this semiannual report for Fund for the six-month period ended April 30, 2018. For additional information about the Fund, please visit our website a, where you can access quarterly commentaries. We value the trust that you place in us and look forward to serving your investment needs in the years to come.
Best regards 
Douglas

Random text here as well"""

Este es mi código hasta ahora, pero no es capaz de atrapar de manera flexible el texto entre las expresiones (puede haber cualquier cosa (líneas, texto, números, signos, etc.) antes del "letter_begin" y después del "letter_end") @

import re

letter_begin = ["dear", "to our", "estimated"] # All expressions for "beginning" of letter 
openings = "|".join(letter_begin)
letter_end = ["sincerely", "yours", "best regards"] # All expressions for "ending" of Letter 
closings = "|".join(letter_end)
regex = r"(?:" + openings + r")\s+.*?" + r"(?:" + closings + r"),\n\S+"


with open(filename, 'r', encoding="utf-8") as infile:
         text = infile.read()
         text = str(text)
         output = re.findall(regex, text, re.MULTILINE|re.DOTALL|re.IGNORECASE) # record all text between Regex (Beginning and End Expressions)
         print (output)

¡Estoy muy agradecido por cada ayuda!

Respuestas a la pregunta(1)

Su respuesta a la pregunta