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.
Zeile einer input datei spalten
@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.
Hallo!
Ich habe leider gar keine Ahnung von Parsern, aber folgende Lösung fällt mir ein:
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.
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
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.
Zuletzt geändert von Barabbas am Donnerstag 5. August 2010, 14:23, insgesamt 1-mal geändert.
@Horst: Ist das zufälligerweise LaTeX? Dann suche mal nach LaTeX, Parser und Python.
Gerrit
Grüßehttp://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.
Gerrit
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)
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Aber nur, wenn du den Kopf als `Zeile` siehst, nimmt man den Koerper passt es wiedersnafu hat geschrieben:Aber gut. Spalten wäre ja quer durch den Kopf. Musste aber trotzdem spontan daran denken.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte