#450 Por partes
(?:) significa non-capturing group. Es decir, creas un grupo para matchear cosas pero no te quedas con el resultado en ningun lado, si yo tengo
(?:a)(b)(c)(?:d)
y matcheo abcd, los grupos que obtendre seran "b" y "c", porque estoy descartando los otros dos.
>>> r = re.compile(r'(?:a)(b)(c)(?:d)')
m = re.match(r, 'abcd')
m.groups()
('b', 'c')
Entonces, (?:\n){2,} significa haz un non-capturing group de saltos de linea, y que haga match dos o mas veces.
Por qué dos o más veces? Porque el input es tal que
a\n
b\n
\n
c\n
d
por lo que matcheando dos o más saltos de línea matcheo de forma efectiva los separadores de los casos de input. Si hago split a partir de los matches obtendré el input en sí.
La pregunta final sería que por qué el grupo del salto de línea es non-capturing. La respuesta es que de no serlo el split me capturaría también los saltos de línea entre casos de input, por lo que usaría uno de split solamente, considera esto
import re
blank = re.compile(r'(?:\n){2,}')
re.split(blank, 'a\n\nb\nc')
['a', 'b\nc']
blank = re.compile(r'(\n){2,}')
re.split(blank, 'a\n\nb\nc')
['a', '\n', 'b\nc']
#456 eres siempre así de borde? todos tus posts son bastante cortantes.