Zeile einer input datei spalten

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
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Hallo Leute,
Ich bins nochmal. Diesmal versuche ich die Zeile eines Textdokumentes einzulesen und anschließend nur einen Teil zu verwenden.

Die Input-Zeile beispielsweise so aus:

\blablablablabla{\B} {{\A}}

wie kannmna diese Zeile spalten, so dass ich nur \B und {\A} einlese. Gibt es einen Befehl, der es ermöglicht nur den Teil in den geschweiften Klammert einließt. Wie geht das ganze, wenn man wie bei {\A} Klammern in Klammern mit einlesen möchte??

Im Moment habe ich nur die Möglichkeit gefunden die Zeile mit einem Zeichen zu splitten:

line.split('{')

Ich hoffe, ihr könnt mir helfen.
BlackJack

@Horst: Du könntest Dir reguläre Ausdrücke mal anschauen (`re`-Modul). Falls Du aber wirklich mit beliebig verschachtelten Klammern klarkommen musst, dann brauchst Du wohl einen echten Parser.
Horst
User
Beiträge: 37
Registriert: Mittwoch 14. April 2010, 17:55

Okay. Wo bekomme ich denn einen Parser und wie funktioniert der?
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo!

Ich habe leider gar keine Ahnung von Parsern, aber folgende Lösung fällt mir ein:

Code: Alles auswählen

text = "\ajsd askd b{\A} {{{\A}}}"

def parse_string(text, open="{", close="}"):
    
    content = ""
    open_counter = 0
    for letter in text:
        if letter == close:
            open_counter -= 1            
            
        if open_counter > 0:
            content += letter
        elif content != "":
            yield content
            content = ""
            
        if letter == open:
            open_counter += 1

for item in  parse_string(text):
    print item
Ob und in wie weit man das noch erweitern kann (vll. will man ja auch noch Attribute oder sowas), weiß ich nicht. Ich habe auch irgendwie das dumpfe Gefühl, dass das hier nicht gerade als schöne Lösung durchgeht. Bin auf Kritik und Verbesserung gespannt.

Schönen Gruß,

brb

//edit: Ein handfester Nachteil ist übrigens, dass geschweifte Klammern (oder was immer man als Anfangs- und Endzeichen festlegt) den Parser völlig aus dem Tritt bringen, wenn sie nicht auch wieder geschlossen werden. Eine geschlossene Klammer am Anfang des Strings würde daher beispielsweise dazu führen, dass der open_counter bei -1 steht - der nächste regulär geöffnete Ausdruck würde nicht erkannt. Wenn man sowas ausschließen will, müsste man noch ein paar Zeilen mehr Code investieren. :oops:
Zuletzt geändert von Barabbas am Donnerstag 5. August 2010, 14:23, insgesamt 1-mal geändert.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

@Horst: Ist das zufälligerweise LaTeX? Dann suche mal nach LaTeX, Parser und Python.
http://de.wikipedia.org/wiki/Parser hat geschrieben:Ein Parser ([...] im Deutschen gelegentlich auch Zerteiler) ist ein Computerprogramm, das in der Computertechnik für die Zerlegung und Umwandlung einer beliebigen Eingabe in ein für die Weiterverarbeitung brauchbares Format zuständig ist.
Grüße
Gerrit
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

Code: Alles auswählen

import re

text = "\blablablablabla{\B} {{{\A}}} {{\C}}aa"

regular_string = re.compile(r'{(.*?)}[^}]')

for m in regular_string.finditer(text):
    print m.group(1)
damit funktioniert deine Vorlage, aber ich bezweifle, dass es für jeden Fall funktioniert.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Horst hat geschrieben:spalten
Bild

*SCNR*

Aber gut. Spalten wäre ja quer durch den Kopf. Musste aber trotzdem spontan daran denken. ;)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

snafu hat geschrieben:Aber gut. Spalten wäre ja quer durch den Kopf. Musste aber trotzdem spontan daran denken. ;)
Aber nur, wenn du den Kopf als `Zeile` siehst, nimmt man den Koerper passt es wieder :twisted:
Antworten