Seite 1 von 1

Text in Abschnitte teilen, re?

Verfasst: Freitag 24. September 2010, 20:01
von _johannes
Hallo,

Ich habe eine längere Textdatei (mit codecs.open(u"dateiname.txt", mode='r', encoding='utf8' geöffnet), die ich in einzelne Abschnitte aufteilen möchte.
Die einzelnen Abschnitte enden jeweils mit "---\n".

Ich möchte also am Ende einige Abschnitte in Variablen gespeichert haben:
a = dateianfang bis zum ersten "---\n"
b = von ende von a bis zum nächsten "---\n"
...
n = von ende von n-1 bis zum letzten "---\n"

Meine bisherigen Ansätze mit re waren überhaupt nicht erfolgreich. Müsste ich die einzelnen Abschnitte nicht mit einem regulären Ausdruck suchen, der etwa wie im Folgenden aussieht?

Code: Alles auswählen

inputfile = codecs.open(u"har_accuracy_anova_items_results.txt", mode='r', encoding='utf8')
wholefile = inputfile.read()
paragraph = re.findall(r'^.+---\n', wholefile)
print paragraph


Leider ist paragraph immer nur eine leere Liste.

Ich stehe glaube ich gerade auf dem Schlauch. Was ist an meiner regex falsch?
Oder gibt es vielleicht sogar für mein Problem einen eleganteren Weg ohne re?

Vielen Dank für Eure Hilfe.

Grüße,
Johannes

Re: Text in Abschnitte teilen, re?

Verfasst: Freitag 24. September 2010, 20:11
von cofi
Du suchst `re.split` und nicht `re.findall` - evtl reicht auch `str.split`.

Re: Text in Abschnitte teilen, re?

Verfasst: Montag 27. September 2010, 15:29
von mkesper
Da du r'\n' eingegeben hast, wird auch genau das gesucht: ein \ und ein folgendes n.
Vermutlich nicht das, was du suchst. Kannst du denn nicht einfach jede Zeile verarbeiten?

Code: Alles auswählen

with("dateiname") as in_file:
    for line in in_file:
        bla

Re: Text in Abschnitte teilen, re?

Verfasst: Donnerstag 14. Oktober 2010, 09:31
von sma
Ist schon länger her, aber vielleicht hilft dies:

Code: Alles auswählen

s = """
Man kann niemanden überholen, 
wenn man in seine Fußstapfen tritt.
---
Die Fähigkeit, das Wort "Nein" auszusprechen, 
ist der erste Schritt zur Freiheit.
---
Es ist viel sicherer, 
zu wenig als zu viel zu wissen.
---
Das Denken ist zwar allen Menschen erlaubt, 
aber vielen bleibt es erspart.
"""

import re
print(re.findall(r"\n*(?ms)(.*?\n)(?:^---|\Z)", s))
Stefan

Re: Text in Abschnitte teilen, re?

Verfasst: Donnerstag 14. Oktober 2010, 10:04
von snafu
mkesper hat geschrieben:Da du r'\n' eingegeben hast, wird auch genau das gesucht: ein \ und ein folgendes n.
Wie kommst du denn darauf? Das `r` vor dem String bewirkt lediglich, dass der String nicht von Python interpretiert wird, sondern quasi in Reinform als Pattern übergeben wird. Die Bedeutung von `\n` bleibt dabei bestehen.

- `r"\n"` wird durch den Python-Interpreter gejagt und zu `"\\n"`
- `re.findall()` (bzw der damit aufgerufene Parser) interpretiert es wieder als `"\n"`, da der Escape-Backslash wegfällt
- die Regex-Enginge sucht wie gewünscht nach `\n`

Man möge mich korrigieren, falls die Erklärung falsch ist.

Re: Text in Abschnitte teilen, re?

Verfasst: Donnerstag 14. Oktober 2010, 10:13
von sma
snafu hat geschrieben:Man möge mich korrigieren, falls die Erklärung falsch ist.
Die Erklärung ist richtig.

Stefan