Regulären Ausdruck mit groups() auswerten

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.
Antworten
gunny
User
Beiträge: 3
Registriert: Mittwoch 4. Februar 2009, 17:04

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

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
gunny
User
Beiträge: 3
Registriert: Mittwoch 4. Februar 2009, 17:04

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?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Nein, da die Kommas in einem String stehen, der mit Gaensefuesschen gekennzeichnet ist.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Nein, so intelligent ist das csv-Modul schon. Einfach mal ausprobieren. :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Außerdem kann man Delimiter auch als Parameter angeben, da muss man nichts ableiten.
gunny
User
Beiträge: 3
Registriert: Mittwoch 4. Februar 2009, 17:04

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.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Warum nimmst du nicht das csv-Modul?

€dit:
Schneller antworten ich sollte.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

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:
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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.
Antworten