Question

Comment écrit-on une expression régulière à utiliser en python pour scinder des paragraphes?

Un paragraphe est défini par 2 sauts de ligne (\ n). Mais on peut avoir n’importe quelle quantité d’espaces / de tabulations avec les sauts de ligne, et cela doit quand même être considéré comme un paragraphe.

J'utilise python pour que la solution puisse utiliser la syntaxe des expressions régulières de python . qui est étendu. (peut utiliser des éléments (? P ...) )

Exemples:

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

Le meilleur que je puisse avoir est le suivant: r '[\ t \ r \ f \ v] * \ n [\ t \ r \ f \ v] * \ n [\ t \ r \ f \ v] * ', c'est-à-dire

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

mais c'est moche. Quelque chose de mieux?

MODIFIER :

Suggestions rejetées:

r '\ s *? \ n \ s *? \ n \ s *?' - > Cela ferait échouer les exemples 2 et 3, car \ s inclut \ n , de sorte qu'il autoriserait les sauts de paragraphe avec plus de 2 \ n s .

Était-ce utile?

La solution

Malheureusement, il n’existe aucun moyen intéressant d’écrire "espace, mais pas de nouvelle ligne".

Je pense que le mieux que vous puissiez faire est d'ajouter un espace avec le modificateur x et d'essayer de factoriser un peu la laideur, mais c'est discutable: (? x) (?: [ \ t \ r \ f \ v] *? \ n) {2} [\ t \ r \ f \ v] v? *?

Vous pouvez également essayer de créer une sous-règle uniquement pour la classe de caractères et de l'interpoler trois fois.

Autres conseils

Essayez-vous de déduire la structure d'un document dans un test simple? Faites-vous ce que docutils fait?

Vous pourrez peut-être simplement utiliser l'analyseur de docutils plutôt que de rouler le vôtre.

Pas une expression rationnelle mais vraiment élégante:

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'

C’est à vous de décaper la sortie au besoin.

Inspiré du célèbre " Python Cookbook " ; -)

Presque identique, mais en utilisant des quantificateurs non gourmands et en tirant parti de la séquence d'espaces.

\s*?\n\s*?\n\s*?
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top