2008-09-22 32 views
5

¿Cómo se podría escribir una expresión regular para usar en python para dividir párrafos?expresión regular 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, entonces la solución puede usar python's regular expression syntax que se extiende. (Se 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 podía venir con 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 que es feo. ¿Algo mejor?

EDITAR:

Sugerencias rechazadas:

r'\s*?\n\s*?\n\s*?' -> Eso haría que el ejemplo 2 y 3 fallar, ya que incluye \s\n, lo que permitiría saltos de párrafo con más de 2 \n s.

Respuesta

4

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

Creo que lo mejor que puede hacer es añadir un poco de espacio con el modificador x y tratar de factorizar la fealdad un poco, pero eso es cuestionable: (?x) (?: [ \t\r\f\v]*? \n){2} [ \t\r\f\v]*?

También podría intentar crear una subregla sólo para la clase de caracteres e interpolarlo tres veces.

+2

Hay. [^ \ S \ n] :) –

0

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

\s*?\n\s*?\n\s*? 
+0

que haría que el ejemplo 2 fallan, porque \ S incluye \ n. – nosklo

2

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

Puede simplemente usar el Docutils parser en lugar de hacer el suyo.

1
No

una expresión regular, pero muy 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' 

Es hasta usted para despojar a la salida a medida que lo necesite, por supuesto.

inspirado en el famoso "Python Cookbook" ;-)

+0

Solución limpia. ¿Qué es 'str_isspace'? –

+0

Un error tipográfico :-) Debería leer str.isspace, que es el método isspace() de la cadena del objeto. Se llamará para determinar si algo es un espacio, y se agrupará el objeto de acuerdo con eso. Lo arreglé. –

+0

Impresionante, tiene sentido, gracias :) –

Cuestiones relacionadas