String an verschiedenen Zeichen teilen

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
Nerethar
User
Beiträge: 2
Registriert: Mittwoch 18. Mai 2011, 21:02

Halihalohalöle,

Ich habe ein klitzekleines Problem bei Python und hoffe ihr helft mir dabei.
Das Problem ist analog zu dem Thread String Teilen, nur mit einem Unterschied:
Ich habe mehrere Zeichen an denen ich splitten muss. Um genau zu sein, soll an allem das nicht zu einem Wort gehört geschnitten werden. Sprich whitespace , . /n usw usw.

In Java hätte ich es einfach per Schleife gemacht, aber da durfte ich mir von meinem Prof den Kommentar anhören (als ich es eben so gemacht hatte^^) das ich ja zu sehr in Java denke und hat mich auf die Split-Methode hingewiesen...
Nun meine Frage? Wie löse ich das Problem elegant und ohne die Javatypische Schleifenverschachtelung?

Nachtag für einen Codeausschnitt:

Code: Alles auswählen

for item in finList:
    temp = open(item, "r")
    for zeile in temp:
        print(zeile.split(","))
    temp.close() 
Das ist was ich habe, was ich jedoch bräuchte ist:

Code: Alles auswählen

print(zeile.split(an jedem nicht buchstabenODERzahl))
Bin für jede Hilfe dankbar =)
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Schau dir mal `re.split` an.

Code: Alles auswählen

>>> import re
>>> re.split('\W', 'Hallo.Welt was/geht\nso')
['Hallo', 'Welt', 'was', 'geht', 'so']
Nerethar
User
Beiträge: 2
Registriert: Mittwoch 18. Mai 2011, 21:02

Vielen vielen Dank, das ist genau das was ich gesucht hab =)
Nur ein Problem hab ich, in meiner Datei steht:

Test1, Test2, Test3
Test4

In meiner Ausgabe von

Code: Alles auswählen

for item in finList:
    temp = open(item, "r")
    for zeile in temp:
        print(re.split("\W", zeile))
    temp.close()  
kommt
['Test1', '', 'Test2', '', 'Test3', '']
['Test4']

bei raus :/ wie schaffe ich es denn nun das ist statt 2 Listen eine Liste bei rauskommt und Dinge wie '' also ein leerer Eintrag vermieden wird?
Tut mir leid für diese elementaren Fragen, aber ich hab kaum Python Erfahrung und Google ist irgendwie nicht mein Freund (habs nicht gefunden :/ )
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

http://docs.python.org http://tutorial.pocoo.org

Ad "eine Liste": `for line in file` iteriert zeilenweise, d.h. es gibt hier zwei Möglichkeiten: 1) eine Resultatliste erstellen und dann jeweils das Split-Ergebnis an `list.extend` weiterreichen; 2) nicht zeilenweise splitten sondern erst alles auslesen und dann `re.split` über den ganzen Dateiinhalt laufen lassen.

Code: Alles auswählen

# 1)
result = []
with open(...) as fileobj:
    for line in fileobj:
        result.extend(re.split('\W', line))

# 2)
with open(...) as fileobj:
    result = re.split('\W', fileobj.read())
Ad "leere Items": Bei `re.split` kann das Pattern eine beliebige Regular Expression sein, d.h. man könnte zum Beispiel auch "\W+" für "alles außer Wortzeichen und davon eins oder mehrere" verwenden.

Code: Alles auswählen

>>> re.split('\W+', 'Hallo  Welt ./!!$ was geht')
['Hallo', 'Welt', 'was', 'geht']
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Die Standard Library ist dein Freund. Insbesondere das itertools-module. In der Doku dazu stehen einige Rezepte, die einem einerseits das Leben sehr erleichtern, und andererseits zeigen, wie man pythonisch an eine Sache herangeht. In deinem Fall zB. so:

Code: Alles auswählen

import re
from itertools import chain

def flatten(iterable):
    "Flatten one level of nesting"
    return chain.from_iterable(iterable)

for filename in finList:
    with open(filename"r") as the_file:
        print(list(flatten(re.split("\W", line) for line in the_file)))
In specifications, Murphy's Law supersedes Ohm's.
Antworten