Pregunta

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

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

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

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 pude 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 \ns.

¿Fue útil?

Solución

Lamentablemente, no existe una forma agradable de escribir "espacio pero no una nueva línea".

Creo que lo mejor que puedes hacer es agregar algo de espacio con el x modificador e intente descartar un poco la fealdad, pero eso es cuestionable: (?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

También puedes intentar crear una subregla solo para la clase de personaje e interpolarla tres veces.

Otros consejos

¿Está intentando deducir la estructura de un documento mediante una prueba simple?¿Estás haciendo lo que documentos ¿hace?

Es posible que pueda utilizar simplemente el Analizador Docutils en lugar de rodar el tuyo propio.

No es una expresión regular pero es 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'

Por supuesto, depende de usted eliminar la salida cuando la necesite.

Inspirado en el famoso "Libro de cocina de Python" ;-)

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

\s*?\n\s*?\n\s*?
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top