Seite 1 von 1

Regulären Ausdruck mit groups() auswerten

Verfasst: Donnerstag 5. Februar 2009, 14:47
von gunny
Hallo erstmal,

bin neu in der Benutzung von Python und möchte mehrzeilige (String-) Daten mit nem regulären Ausdruck auswerten.

Die Daten sehen so aus:

"Nummer","Code","Bez 1","Maße","Gewicht","Warengruppe","EK 1","Ist-Bestand 1","Bestand 2"
"AAA-AAA","AAA-AAA*","18.11.2008.00",,,"500","4","0","0"
"C,,212","31028*01**","Handgriff","29x51x3","5","303","98.969","0","0"
...

Also ein CSV-mäßiger Aufbau. Dabei möchte ich jetzt aus diesen Werten Semikolon-getrennte CSV-Daten machen, also mit o.g. Beispielen:


Nummer;Code;Bez 1;Maße;Gewicht;Warengruppe;EK 1;Ist-Bestand 1;Bestand 2
AAA-AAA;AAA-AAA*;18.11.2008.00;;;500;4;0;0
C,,212;31028*01**;Handgriff;29x51x3;5;303;98.969;0;0
...

Wichtig dabei ist es, dass innerhalb der Quotes die Kommas nicht verändert werden dürfen (siehe letzte Zeile).

Das Ganze wollte ich jetzt mit folgendem Weg angehen (in data stehen oben genannte Daten):

Code: Alles auswählen

import re
m = re.match(r"\"(.*)\"", data)
print "groups: "
print m.groups()
So bekomme ich aber (aufgrund der greedy-Eigenschaft) nur das als Ergebnis:

Code: Alles auswählen

('Nummer","Code","Bez 1","Maße","Gewicht","Warengruppe","EK 1","Ist-Bestand 1","Bestand 2')
also ein Tupel mit dem gesamten String im Index[0].

Wie schaffe ich es, dass ich ein Tupel bekomme, das so aussieht:

Code: Alles auswählen

('Nummer','Code','Bez 1','Maße','Gewicht','Warengruppe','EK 1','Ist-Bestand 1','Bestand 2')
?

Und wie 'iteriere' ich über die Zeilen?

Danke im voraus, sehe den Wald vor regulären Ausdrücken nicht mehr, hab schon so viel rumprobiert... :(

Verfasst: Donnerstag 5. Februar 2009, 15:04
von helduel
Moin,

nimmt doch das csv-Modul. Das ist für CSV-Daten gedacht. Da brauchst du nur die Daten einlesen und dann wieder mit einem anderen Feldtrenner schreiben. Mit Regexes könntest du das zwar auch bewerkstelligen, aber die sind einfach das falsche Werkzeug dafür.

Gruß,
Manuel

Verfasst: Donnerstag 5. Februar 2009, 15:11
von gunny
helduel hat geschrieben:nimmt doch das csv-Modul. Das ist für CSV-Daten gedacht. Da brauchst du nur die Daten einlesen und dann wieder mit einem anderen Feldtrenner schreiben. Mit Regexes könntest du das zwar auch bewerkstelligen, aber die sind einfach das falsche Werkzeug dafür.
Hallo, danke für die Antwort.

Wenn ich das so mache:

Code: Alles auswählen

class csv_custom(csv.excel):
        delimiter = ','

csv.register_dialect('custom', csv_custom)
Habe ich dann nicht das problem, dass ich, wenn ich aufgrund der Kommas trenne, bei der letzten Zeile Probleme bekomme, da die Werte teilweise auch Kommas enthalten?

Verfasst: Donnerstag 5. Februar 2009, 15:33
von Rebecca
Nein, da die Kommas in einem String stehen, der mit Gaensefuesschen gekennzeichnet ist.

Verfasst: Donnerstag 5. Februar 2009, 15:34
von helduel
Nein, so intelligent ist das csv-Modul schon. Einfach mal ausprobieren. :)

Verfasst: Donnerstag 5. Februar 2009, 16:14
von Leonidas
Außerdem kann man Delimiter auch als Parameter angeben, da muss man nichts ableiten.

Verfasst: Donnerstag 5. Februar 2009, 17:11
von gunny
Danke für eure Hilfe, habe es dann mit dem CSV-Modul hinbekommen - es rafft tatsächlich, wann ein Komma zum Wert gehört und wann es ein Begrenzer ist.

@Leonidas: danke für den Tipp, habe mein Script mittlerweile etwas abstrahiert, so dass ich immer Dialekte übergebe mit denen gearbeitet werden soll. Daher ist es dann übersichtlicher, diese zu definieren und zu übergeben.

Aber für eine adhoc-Benutzung ist die Delimiter-Übergabe als Parameter sicher kompakter.

Verfasst: Donnerstag 5. Februar 2009, 17:47
von audax
Warum nimmst du nicht das csv-Modul?

€dit:
Schneller antworten ich sollte.

Verfasst: Donnerstag 5. Februar 2009, 18:26
von rayo
audax hat geschrieben:Warum nimmst du nicht das csv-Modul?

€dit:
Schneller antworten ich sollte.
omg, hast du etwas das Fenster zwischen 16:04 und 18:47 nicht mehr aktualisiert?? :shock:

Verfasst: Freitag 6. Februar 2009, 04:50
von audax
rayo hat geschrieben:
audax hat geschrieben:Warum nimmst du nicht das csv-Modul?

€dit:
Schneller antworten ich sollte.
omg, hast du etwas das Fenster zwischen 16:04 und 18:47 nicht mehr aktualisiert?? :shock:
jap.