Seite 1 von 1
Zeile einer input datei spalten
Verfasst: Donnerstag 5. August 2010, 13:52
von Horst
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.
Re: Zeile einer input datei spalten
Verfasst: Donnerstag 5. August 2010, 13:56
von 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.
Re: Zeile einer input datei spalten
Verfasst: Donnerstag 5. August 2010, 14:01
von Horst
Okay. Wo bekomme ich denn einen Parser und wie funktioniert der?
Re: Zeile einer input datei spalten
Verfasst: Donnerstag 5. August 2010, 14:18
von Barabbas
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.

Re: Zeile einer input datei spalten
Verfasst: Donnerstag 5. August 2010, 14:21
von gkuhl
@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
Re: Zeile einer input datei spalten
Verfasst: Donnerstag 5. August 2010, 15:49
von DaMutz
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.
Re: Zeile einer input datei spalten
Verfasst: Donnerstag 5. August 2010, 16:48
von snafu
Horst hat geschrieben:spalten
*SCNR*
Aber gut. Spalten wäre ja quer durch den Kopf. Musste aber trotzdem spontan daran denken.

Re: Zeile einer input datei spalten
Verfasst: Donnerstag 5. August 2010, 16:59
von cofi
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
