Expresión regular de Python que coincide con varias líneas (re.DOTALL)

Estoy tratando de analizar una cadena con varias líneas.

Supongamos que es:

text = ''' Section1 stuff belonging to section1 stuff belonging to section1 stuff belonging to section1 Section2 stuff belonging to section2 stuff belonging to section2 stuff belonging to section2 ''' 

Quiero usar el método de búsqueda del módulo re para obtener un diccionario como:

 {'section': 'Section1', 'section_data': 'stuff belonging to section1\nstuff belonging to section1\nstuff belonging to section1\n'} {'section': 'Section2', 'section_data': 'stuff belonging to section2\nstuff belonging to section2\nstuff belonging to section2\n'} 

Intenté lo siguiente:

 import re re_sections=re.compile(r"(?P
Section\d)\s*(?P
.+)", re.DOTALL) sections_it = re_sections.finditer(text) for m in sections_it: print m.groupdict()

Pero esto resulta en:

 {'section': 'Section1', 'section_data': 'stuff belonging to section1\nstuff belonging to section1\nstuff belonging to section1\nSection2\nstuff belonging to section2\nstuff belonging to section2\nstuff belonging to section2\n'} 

Así que la sección de datos también coincide con la Sección 2.

También traté de decirle al segundo grupo que coincida con todos menos el primero. Pero esto lleva a ninguna salida en absoluto.

 re_sections=re.compile(r"(?P
Section\d)\s+(?P
^(?P=section))", re.DOTALL)

Sé que podría usar la siguiente referencia, pero estoy buscando una versión en la que no tenga que decir qué aspecto tiene el segundo grupo.

 re_sections=re.compile(r"(?P
Section\d)\s+(?P
[a-z12\s]+)", re.DOTALL)

¡Muchas gracias!

Use un look-ahead para hacer coincidir todo hasta el siguiente encabezado de sección, o el final de la cadena:

 re_sections=re.compile(r"(?P
Section\d)\s*(?P.+?)(?=(?:Section\d|$))", re.DOTALL)

Tenga en cuenta que esto necesita un no-codicioso .+? también, de lo contrario, igual se emparejará hasta el final primero.

Manifestación:

 >>> re_sections=re.compile(r"(?P
Section\d)\s*(?P.+?)(?=(?:Section\d|$))", re.DOTALL) >>> for m in re_sections.finditer(text): print m.groupdict() ... {'section': 'Section1', 'section_data': 'stuff belonging to section1\nstuff belonging to section1\nstuff belonging to section1\n'} {'section': 'Section2', 'section_data': 'stuff belonging to section2\nstuff belonging to section2\nstuff belonging to section2'}