Text in Abschnitte teilen, re?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
_johannes
User
Beiträge: 20
Registriert: Montag 19. Juni 2006, 17:37

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du suchst `re.split` und nicht `re.findall` - evtl reicht auch `str.split`.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

snafu hat geschrieben:Man möge mich korrigieren, falls die Erklärung falsch ist.
Die Erklärung ist richtig.

Stefan
Antworten