Domanda

Come si potrebbe scrivere un'espressione regolare da usare in Python per dividere i paragrafi?

Un paragrafo è definito da 2 interruzioni di riga (\ n). Ma uno può avere qualsiasi quantità di spazi / tabulazioni insieme alle interruzioni di riga, e dovrebbe comunque essere considerato come un paragrafo.

Sto usando Python in modo che la soluzione possa usare la sintassi delle espressioni regolari di Python che è esteso. (può utilizzare (? P ...) roba)

Esempi:

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']

Il meglio che potrei venire è: r '[\ t \ r \ f \ v] * \ n [\ t \ r \ f \ v] * \ n [\ t \ r \ f \ v] * ', ovvero

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

ma è brutto. Qualcosa di meglio?

Modifica :

Suggerimenti respinti:

r '\ s *? \ n \ s *? \ n \ s *?' - > Ciò farebbe fallire gli esempi 2 e 3, poiché \ s include \ n , quindi consentirebbe interruzioni di paragrafo con più di 2 \ n s .

È stato utile?

Soluzione

Sfortunatamente non c'è un bel modo di scrivere " spazio ma non una nuova riga " ;.

Penso che il meglio che puoi fare sia aggiungere un po 'di spazio con il modificatore x e provare a scomporre un po' la bruttezza, ma questo è discutibile: (? x) (?: [ \ t \ r \ f \ v] *? \ n) {2} [\ t \ r \ f \ v] *?

Potresti anche provare a creare una sottoregola solo per la classe di caratteri e ad interpolarla tre volte.

Altri suggerimenti

Stai cercando di dedurre la struttura di un documento in prova semplice? Stai facendo ciò che docutils fa?

Potresti semplicemente utilizzare il Docutils parser piuttosto che rollare il tuo.

Non è una regexp ma davvero 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'

Spetta a te eliminare l'output di cui hai bisogno, ovviamente.

Ispirato al famoso " Python Cookbook " ; -)

Quasi lo stesso, ma usando quantificatori non avidi e sfruttando la sequenza degli spazi bianchi.

\s*?\n\s*?\n\s*?
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top