Regex - Alles aus einem String nach Komma entfernen

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
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

Hey zusammen,

ich hab ein csv mit zwei Spalten. In Spalte 1 stehen Bezeichnungen, in Spalte 2 stehen Adressen
schwager | max müller, musterstr.12, muster-ort, musterland
Ich würde nun gern alles aus Spalte 2 nach dem ersten Komma entfernen und den rest in Spalte 3 schreiben.
schwager | max müller, musterstr.12, musterort, musterland | max müller
Ich habs so gemacht.

Code: Alles auswählen

row2 = [row[0],row[1],re.sub(',.+', '', row[1])]
Hab ich irgenwas nicht bedacht?

LG
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

Ja, wo genau löscht du denn den Rest aus Spalte 2?
Ich bin kein großer Freund von regex, bis ihre Komplexität den Einsatz tatsächlich rechtfertigt.

Wie genau erstellst du denn row? Mit dem csv-Modul aus der Bibliothek, oder mittels split?

Ich würde jedenfalls row[1] mit split aufteilen lassen und dann bequem den ersten Treffen in die neue Spalte 2 schreiben und den Rest in mttels ",".join in die 3.
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

Hi,
sparrow hat geschrieben:Wie genau erstellst du denn row

Code: Alles auswählen

with open(os.path.join(datei), "rb") as f: #öffnet die jeweilige datei
    reader = csv.reader(f, delimiter="\t") #liest die zeilen aus, tabstop getrennt
    for row in reader:
sparrow hat geschrieben:wo genau löscht du denn den Rest aus Spalte 2?
Dann ersetze ich ja in Spalte 2 (row[1]) alles nach dem Komme mit ""

Code: Alles auswählen

re.sub(',.+', '', row[1])
Mit split müsste es ja so in die Richtung gehen,

Code: Alles auswählen

name, stadt, land = row[1].split[", "]    
        row2 = row + [name]    
Aber row[1] ist ja nicht zu splitten oder.

LG
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

kidchino hat geschrieben:
sparrow hat geschrieben:wo genau löscht du denn den Rest aus Spalte 2?
Dann ersetze ich ja in Spalte 2 (row[1]) alles nach dem Komme mit ""

Code: Alles auswählen

re.sub(',.+', '', row[1])
Wenn ich deinen Code aus dem ersten Post richtig verstehe:

Code: Alles auswählen

row2 = [row[0],row[1],re.sub(',.+', '', row[1])]
Du schreibst den Inhalt von Spalte0 unverändert in die neue Spalte 0.
Du schreibst den Inhalt von Spalte1 unverändert in die neue Spalte 1.
Du machst irgendwelchen regex-Kram mit der Spalte1 und schreibst das Ergebnis in die neue Spalte2.

Du sagst aber im ersten Post, dass der Rest nach dem Komma nicht in der neuen Spalte1 ankommen soll.

Um die Sache mit einem Split zu lösen:
split gibt dir eine Liste von Einträgen zurück. Die brauchst du nicht Variablen zuordnen.
Die neue Spalte1 ist dann Eintrag 0 in den splits
Die neue Spalte2 ist dann der Rest, mit Komma getrennt. Dafür kannst du ", ".join(splits[1:]) verwenden.
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

Ich hab mich wohl missverständlich ausgedrückt.
Aus dem Startpost
ich hab ein csv mit zwei Spalten. In Spalte 1 (ich meine row[0]) stehen Bezeichnungen, in Spalte 2(ich meine row[1]) stehen Adressen
schwager | max müller, musterstr.12, muster-ort, musterland
Ich würde nun gern alles aus Spalte 2 (ich meine row[1]) nach dem ersten Komma entfernen (Spalte 1 und 2 sollen aber so bleiben, siehe Zitat) und den rest in Spalte 3 (ich meine row[3]) schreiben.
schwager | max müller, musterstr.12, musterort, musterland | max müller
sparrow hat geschrieben:Um die Sache mit einem Split zu lösen:
Danke. Ich probier gleich mal.
kidchino
User
Beiträge: 91
Registriert: Montag 17. November 2014, 14:18

kidchino hat geschrieben:Ich hab mich wohl missverständlich ausgedrückt.
Gott, das kann ja auch missverstanden werden, so wie ichs formuliert habe ... :shock:

Beim split kommt immer ein Fehler.

Code: Alles auswählen

    row[1].split[", "]
TypeError: 'builtin_function_or_method' object has no attribute '__getitem__'
Ich glaube ich lasse es sonst beim regex. Diese Sachen ""__getitem__"" versteh ich leider nicht so richtig.
Trotzdem danke!!
Benutzeravatar
sparrow
User
Beiträge: 4599
Registriert: Freitag 17. April 2009, 10:28

1. Funktionsaufrufe erwarten Parameter in () nicht in [] daher dein Fehler

2. Falls ich dich doch richtig verstanden habe, kannst du dir das join auch sparen, wie mir gerade einfällt:

Wenn du dir split() anschaust, dann wirst du sehen, dass man sagen kann nach wie vielen splits er aufhören soll.

Gibt man als 2. Parameter eine Zahl an, werden so viele Element am Anfang der Liste stehen, dann wird aufgehört zu splitten und der Rest steht im letzten Element der Liste.

Da könntest du dir direkt sparen den Rest wieder mit join zusammen zu klöppeln.

Code: Alles auswählen

>>> d = "dies - sind - einzelteile - eines - satzes"
>>> d.split(" - ")
['dies', 'sind', 'einzelteile', 'eines', 'satzes']
>>> d.split(" - ", 1)
['dies', 'sind - einzelteile - eines - satzes']
>>> d.split(" - ", 2)
['dies', 'sind', 'einzelteile - eines - satzes']
>>> d.split(" -", 10)
['dies', ' sind', ' einzelteile', ' eines', ' satzes
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Deine Beschreibung ist sehr unglücklich.

Kurz gesagt: Spalte 1 und 2 bleiben unverändert und die neue Spalte 3 enthält aus Spalte 2 den Teil vor dem ersten Komma.

Das lässt sich auch gedanklich leichter in Programmlogik umsetzen. Spalte 2 wird am Komma zerlegt (split) und dann das erste Element (Index 0) der Ergebnisliste genommen. Dieses Element fügt man in einer neue Spalte an (append).

Code: Alles auswählen

>>> data = ['schwager', 'max müller, musterstr.12, muster-ort, musterland']
>>> data.append(data[1].split(',')[0])
>>> data
['schwager', 'max müller, musterstr.12, muster-ort, musterland', 'max müller']
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Jetzt bleibt die Frage, wieso man die zusammengesetzten Daten so belässt :K

Ich würde das ja idR. zu Beginn welchen Prozesses auch immer sauber parsen und dann für Ausgaben o.ä. ggf. wieder zusammensetzen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten