regulares python3 online expresiones ejemplos abder python regex parsing text split

python3 - findall python re



expresiĆ³n regular python para dividir pĆ”rrafos (4)

¿Cómo se podría escribir una expresión regular para usar en python para dividir párrafos?

Un párrafo está definido por 2 saltos de línea (/ n). Pero uno puede tener cualquier cantidad de espacios / pestañas junto con los saltos de línea, y todavía debe considerarse como un párrafo.

Estoy usando python para que la solución pueda usar la sintaxis de expresión regular de python que se extiende. (puede hacer uso de (?P...) cosas)

Ejemplos:

the_str = ''paragraph1/n/nparagraph2'' # splitting should yield [''paragraph1'', ''paragraph2''] the_str = ''p1/n/t/np2/t/n/tstill p2/t /n /n/tp3'' # should yield [''p1'', ''p2/t/n/tstill p2'', ''p3''] the_str = ''p1/n/n/n/tp2'' # should yield [''p1'', ''/n/tp2'']

Lo mejor que puedo encontrar es: r''[ /t/r/f/v]*/n[ /t/r/f/v]*/n[ /t/r/f/v]*'' , es decir

import re paragraphs = re.split(r''[ /t/r/f/v]*/n[ /t/r/f/v]*/n[ /t/r/f/v]*'', the_str)

pero eso es feo ¿Algo mejor?

EDITAR :

Sugerencias rechazadas:

r''/s*?/n/s*?/n/s*?'' -> Eso haría que los ejemplos 2 y 3 fallaran, ya que /s incluye /n , por lo que permitiría saltos de párrafo con más de 2 /n s.


¿Estás tratando de deducir la estructura de un documento en una prueba simple? ¿Estás haciendo lo que docutils hace?

Es posible que simplemente puedas usar el analizador Docutils en lugar de usar el tuyo propio.


Casi lo mismo, pero usando cuantificadores no codiciosos y aprovechando la secuencia de espacios en blanco.

/s*?/n/s*?/n/s*?


Lamentablemente, no hay una buena forma de escribir "espacio, pero no una nueva línea".

Creo que lo mejor que puedes hacer es agregar algo de espacio con el modificador x e intentar restar importancia a la fealdad, pero eso es cuestionable: (?x) (?: [ /t/r/f/v]*? /n ){2} [ /t/r/f/v]*?

También podría intentar crear una subregla solo para la clase de caracteres e interpolarla tres veces.


No es una expresión regular, pero realmente elegante:

from itertools import groupby def paragraph(lines) : for group_separator, line_iteration in groupby(lines.splitlines(True), key = str.isspace) : if not group_separator : yield ''''.join(line_iteration) for p in paragraph(''p1/n/t/np2/t/n/tstill p2/t /n /n/tp''): print repr(p) ''p1/n'' ''p2/t/n/tstill p2/t /n'' ''/tp3''

Depende de ti tirar la salida como lo necesites, por supuesto.

Inspirado en el famoso "Python Cookbook" ;-)