Seite 1 von 2

schöner splitten? string.split() Frage

Verfasst: Donnerstag 26. Februar 2009, 11:24
von christine
Hallo Zusammen,

Bitte nochmal um eine "verschönerungs" Hilfe.

Ich lese ein Datum der Form aus: <DATUM>2008-08-08</DATUM>
Und dann möchte ich nur noch die Jahreszahl erhalten.
Das mache ich über split().
Siehe unten :roll:

Kann man das auch schöner "splitten" zum Beispliel alles auf einmal ?
Ich hab es versucht mit der Form: split('x'+'y').
Das hat nicht fuktioniert.

mercy, gruß, christine

Code: Alles auswählen

liste_datum = re.findall(r"<DATUM>.+</DATUM>",text)

for abfrageErgebnis in liste_datum:
            abfrageErgebnis = abfrageErgebnis.split('>')
            abfrageErgebnis = abfrageErgebnis[1].split('<')
            abfrageErgebnis = abfrageErgebnis[0]#gibt das Datum in diese Form aus: 2008-08-08
            abfrageErgebnis = abfrageErgebnis.split('-')
            abfrageErgebnis = abfrageErgebnis[0]#gibt das Datum in diese Form aus: 2008

Verfasst: Donnerstag 26. Februar 2009, 11:59
von helduel
Moin christine,

wenn du eh schon Reguläre Ausdrücke verwendest, dann lasst dir die Jahreszahl direkt zurückgeben:

Code: Alles auswählen

import re
text = """<DATUM>2008-08-08</DATUM>
<DATUM>2009-09-09</DATUM>"""
re.findall("<DATUM>(\d{4}).*</DATUM>", text)
# ['2008', '2009']
Gruß,
Manuel

Verfasst: Donnerstag 26. Februar 2009, 12:01
von christine
vielleicht könnte ich es mit einem regulären Ausdruck in der split Funktion versuchen...

Ich zerteile gerade einen string über entities:
wort.split('&auml;')

Das funktioniert.

Wenn ich jetzt statt auml; einen regulären Ausdruck einfüge, könnte es klappen.

Ich werde es nacher mal versuchen..
Bis dann, christine

Verfasst: Donnerstag 26. Februar 2009, 12:05
von christine
Hey Manuel,

hat sich gerade überschnitten.

Deine Lösung sieht auf jedenfall besser aus. Werde es so umsetzen.

Ich bin noch nicht so "drin" in der ganzen Geschichte und mache viele Sachen wohl etwas umständlich, komme aber noch nicht darauf wie es einfacher geht.

Also mercy schonmal

Verfasst: Donnerstag 26. Februar 2009, 12:06
von cofi
Mich beschleicht gerade das Gefühl, dass du eigentlich XML/HTML bearbeiten willst ...
Wenn dem so ist, benutze lieber Libs wie ElementTree/lxml.xml bzw lxml.html/BeatifulSoup. Das macht den Code bei weitem stabiler gegenüber RegExp.

Verfasst: Donnerstag 26. Februar 2009, 12:14
von christine
hi cofi,

ich möchte sgml Dateien durchsuchen und bestimmte Werte, so sie denn vorhanden sind, ausgeben. Und die Dateien dann dementsprechend sortieren.

Mit ElementTree kenn ich mich nicht aus.
Ich habe schonmal einen versuch gestartet das modul minidom (oder ähnlich..?!) zu benutzen.

Bin aber auch nicht weit gekommen.

Über einen Link auf eine schöne Doku würde ich mich freuen :wink:

grüße

Verfasst: Donnerstag 26. Februar 2009, 12:17
von christine
@ manuel:

huch, vor lauter geschreibe habe ich garnicht gesehen wie genial deine Lösung ist :oops:

cool, Dankeschön

Verfasst: Donnerstag 26. Februar 2009, 13:37
von helduel
christine hat geschrieben:@ manuel:

huch, vor lauter geschreibe habe ich garnicht gesehen wie genial deine Lösung ist :oops:

cool, Dankeschön
8)

Naja, sagen wir fast. Folgendes ist besser, da performanter:

Code: Alles auswählen

re.findall("<DATUM>(\d{4}).*?</DATUM>", text)
Das Problem ist, dass ".*" greedy ist und immer sowie wie möglich matchen will. D. h., nach der ersten Jahreszahl sammelt ".*" alles ein, bis hin zum letzten "</DATUM>". Das macht er dann für jedes DATUM-Tag. Das ist natürlich unsinn. Wenn man aber ".*?" angibt, dann versucht er so wenig wie möglich zu matchen; bleibt also inerhalb der DATUM-Tags.

Gruß,
Manuel

Verfasst: Donnerstag 26. Februar 2009, 13:45
von hendrikS
Vielleicht mal so was probieren:

Code: Alles auswählen

string.strip("</DATUM>").split('-')[0]
Fuer so was reguläre Ausdruecke ist n'bisschen mit dem Schinken nach der Wurst geschmissen.

Verfasst: Donnerstag 26. Februar 2009, 13:57
von christine
@ manuel:

ah ja, dann werde ich das jetzt gleich nochmal verbessern

danke :)

Verfasst: Donnerstag 26. Februar 2009, 14:00
von helduel
hendrikS hat geschrieben:Fuer so was reguläre Ausdruecke ist n'bisschen mit dem Schinken nach der Wurst geschmissen.
Nö. Genau für sowas sind Regexes da. Außerdem sieht man der Regex hier deutlich an, was geliefert wird und findet zudem alle Daten.

Verfasst: Donnerstag 26. Februar 2009, 14:10
von cofi
Na SGML und XML sind ja verwandt ;)
Dokumentation zu Etree: http://docs.python.org/library/xml.etre ... ttree.html
Eventuell wirst du aber mit lxml glücklicher: http://codespeak.net/lxml/

Verfasst: Donnerstag 26. Februar 2009, 14:43
von christine
danke cofi,
werds mir mal durchsehen.
:)

Verfasst: Donnerstag 26. Februar 2009, 14:54
von Leonidas
cofi hat geschrieben:Na SGML und XML sind ja verwandt ;)
Eher weniger. Das was gültiges SGML ist muss nichtmal valides XML sein. Ein einfaches Beispiel ist etwa das aus HTML 4 bekannte <IMG>-Tag, das in XHTML <img /> lauten muss. Und da gibt es noch Reihenweise Unterschiede, soweit dass kein einziger Browser einen SGML-Parser hat und ich bir gar nicht sicher bin ob es Parser gibt, die überhaupt alles was SGML erlaubt, parsen können.

Verfasst: Donnerstag 26. Februar 2009, 15:04
von christine
@Leonidas

deshalb bin ich mir auch nicht so sicher ob ich
die Libs und module von XML verwenden kann. Aber in die Doku reinschauen lohnt sich sicher, vielleicht steht da auch was zu sgml drin

XML ist ja eine Untermenge von SGML.

SGML war auch zuerst da und XML /HTML wurden daraus entwickelt.

soweit mein Wissen.

Grüße,
Christine

Verfasst: Donnerstag 26. Februar 2009, 15:10
von Leonidas
Python 2.x hat die sgmllib, aber man sollte da keinen vollständigen Parser erwarten.

Wenn du mit XML-Tools hinkommst ist das in Ordnung, ansonsten kannst du entweder reguläre Ausdrücke weiterverwenden (wenn es nicht allzu komplex ist, was du da vorhast) oder einen eigenen SGML-Parser schreiben bzw. gucken ob nicht jemand sowas schon gemacht hat. Ist allerdings dann aufwendiger - kein Wunder das SGML am aussterben ist.

Verfasst: Donnerstag 26. Februar 2009, 16:13
von christine
ah, ok, danke für die lib!
ja, klar ich schreibe mal kurz einen Parser ;)
da muss ich glaub erst noch ein bischen länger hier surfen.

grüße,
Christine

Verfasst: Samstag 28. Februar 2009, 10:26
von birkenfeld
hendrikS hat geschrieben:Vielleicht mal so was probieren:

Code: Alles auswählen

string.strip("</DATUM>").split('-')[0]
Das sieht mir sehr nach einem Missbrauch des Arguments von strip() aus.

Verfasst: Samstag 28. Februar 2009, 12:15
von hendrikS
birkenfeld hat geschrieben:
hendrikS hat geschrieben:Vielleicht mal so was probieren:

Code: Alles auswählen

string.strip("</DATUM>").split('-')[0]
Das sieht mir sehr nach einem Missbrauch des Arguments von strip() aus.
Bitte mal die Doku lesen, bevor Du so was schreibst!!

Verfasst: Samstag 28. Februar 2009, 12:24
von birkenfeld
hendrikS hat geschrieben:
birkenfeld hat geschrieben:
hendrikS hat geschrieben:Vielleicht mal so was probieren:

Code: Alles auswählen

string.strip("</DATUM>").split('-')[0]
Das sieht mir sehr nach einem Missbrauch des Arguments von strip() aus.
Bitte mal die Doku lesen, bevor Du so was schreibst!!
Du bist witzig, weißt du das?