Cómo emparejar un párrafo usando expresiones regulares

He estado luchando con las expresiones regulares de python por un tiempo tratando de hacer coincidir los párrafos dentro de un texto, pero no he tenido éxito. Necesito obtener las posiciones inicial y final de los párrafos.

Un ejemplo de un texto:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 

En este caso de ejemplo, me gustaría hacer coincidir por separado todos los párrafos que comienzan con Lorem, Stet e Ipsum respectivamente (sin las líneas vacías). ¿Alguien tiene alguna idea de como se hace esto?

Puedes dividir en doble nueva línea como esta:

 paragraphs = re.split(r"\n\n", DATA) 

Editar: para capturar los párrafos como coincidencias, para que pueda obtener sus puntos de inicio y finalización, haga lo siguiente:

 for match in re.finditer(r'(?s)((?:[^\n][\n]?)+)', DATA): print match.start(), match.end() # Prints: # 0 214 # 215 298 # 299 589 

El uso de la división es una forma, puede hacerlo con expresiones regulares, así:

 paragraphs = re.search('(.+?\n\n|.+?$)',TEXT,re.DOTALL) 

El .+? es una coincidencia perezosa, coincidirá con la subcadena más corta que hace coincidir toda la expresión regular. De lo contrario, solo coincidirá con toda la cadena.

Básicamente, aquí queremos encontrar una secuencia de caracteres ( .+? ) Que termina con una línea en blanco ( \n\n ) o el final de la cadena ( $ ). La re.DOTALL hace que el punto coincida con la nueva línea (también queremos hacer coincidir un párrafo que consta de tres líneas sin líneas en blanco)

¿Qué es el símbolo de nueva línea? Supongamos que el símbolo de nueva línea es ‘\ r \ n’, si desea hacer coincidir los párrafos que comienzan con Lorem, puede hacer lo siguiente:

 pattern = re.compile('\r\nLorem.*\r\n') str = '...' # your source text matchlist = re.findall(pattern, str) 

La lista de partidos contendrá todo el inicio de paragragh con Lorem. Y las otras dos palabras son las mismas.

Tratar

 ^(.+?)\n\s*\n 

o

 ^(.+?)\r\n\s*\r\n 

Simplemente no olvide añadir una nueva línea adicional al final del texto

Intenté usar el RegEx recomendado con el motor predeterminado de Java RegEx. Eso me dio varias veces una excepción StackOverflowException, por lo que al final reescribí el RegEx y lo optimicé un poco más.

Así que esto está funcionando bien para mí en Java:

 (?s)(.*?[^\:\-\,])(?:$|\n{2,}) 

Esto también maneja el final del documento sin nuevas líneas e intenta concatear las líneas que terminan con ‘:’, ‘-‘ o ‘,’ al siguiente párrafo.

Y para evitar que los espacios en blanco finales (espacios en blanco o tabs) rompan la función descrita anteriormente, los estoy eliminando antes con la siguiente expresión regular:

 (?m)[[:blank:]]+$