schöner splitten? string.split() Frage

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.
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

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
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

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
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

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

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.
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

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
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

@ manuel:

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

cool, Dankeschön
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

@ manuel:

ah ja, dann werde ich das jetzt gleich nochmal verbessern

danke :)
Zuletzt geändert von christine am Donnerstag 26. Februar 2009, 14:05, insgesamt 1-mal geändert.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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

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/
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

danke cofi,
werds mir mal durchsehen.
:)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

@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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
christine
User
Beiträge: 31
Registriert: Dienstag 24. Februar 2009, 10:03

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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!!
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten