Frage

Wie würde man einen regulären Ausdruck schreibt in Python verwenden Absätze aufgeteilt?

Ein Absatz wird von Zeilenumbrüchen 2 (\ n) definiert ist. Aber man kann eine beliebige Anzahl von Räumen haben / tabs zusammen mit den Zeilenumbrüchen und es sollte immer noch als Absatz in Betracht gezogen werden.

Ich verwende Python so kann die Lösung Python verwenden Syntax für reguläre Ausdrücke welches verlängert. (Kann Verwendung von (?P...) Sachen machen)

Beispiele:

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

Das Beste, was ich kommen könnte ist: r'[ \t\r\f\v]*\n[ \t\r\f\v]*\n[ \t\r\f\v]*', das heißt

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

, aber das ist hässlich. Alles, was besser?

Bearbeiten :

Vorschläge abgelehnt:

r'\s*?\n\s*?\n\s*?'. -> Das wäre Beispiel machen 2 und 3 nicht, da \s \n enthält, so würde es Absatzumbrüche mit mehr als 2 \ns erlauben

War es hilfreich?

Lösung

Leider gibt es keine schöne Art und Weise zu schreiben „Raum aber keinen Newline“.

ich glaube, das Beste, was Sie tun können, ist etwas Platz mit dem x Modifikator hinzufügen und versuchen, der Hässlichkeit ein wenig Faktor, aber das ist fraglich: (?x) (?: [ \t\r\f\v]*? \n ){2} [ \t\r\f\v]*?

Sie können auch versuchen, eine Subrule nur für die Zeichenklasse zu schaffen und es dreimal interpoliert werden.

Andere Tipps

Sind Sie versuchen, die Struktur eines Dokuments im Klar Test ableiten? Werden Sie das tun, was docutils das?

Sie könnten in der Lage sein, einfach zu verwenden, die Docutils Parser , anstatt Ihre eigene Rolle.

Nicht ein regexp aber wirklich elegant:

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 ist an Ihnen, den Ausgang zu strippen, wie Sie es brauchen natürlich.

von dem berühmten "Python-Kochbuch" inspiriert; -)

Fast das gleiche, aber unter Verwendung von nicht-gierigen Quantoren und Vorteile der Leerzeichen-Sequenz unter.

\s*?\n\s*?\n\s*?
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top