Erweitertes split()

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
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

Hallo zusammen
Gibt es eine Art erweitertes split(), welches erlauben würde, ein Argument zu splitten, auch wenn der delimiter nicht bekannt ist. Also, erst würde split() versuchen auf whitespace zu splitten, wenn kein whitespace vorhanden ist, dann auf ':', sonst auf '-' und sonst noch auf '_'. Das wäre die Idee.
Oder muss man das selber programmieren?

Besten Dank für Hinweise.
[url=http://www.proandkon.com]proandkon.com[/url]
BlackJack

@mzh: Das muss man wohl selber implementieren. Vielleicht auch unter Hilfe von `csv.Sniffer`!?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

def split(s, seps, maxsplit=-1):
    for sep in seps:
        parts = s.split(sep, maxsplit)
        if len(parts) > 1:
            return parts
    return parts


print split('ab c', [' ', '-', ':'])
print split('ab-c', [' ', '-', ':'])
print split('ab:c', [' ', '-', ':'])
print split('ab!c', [' ', '-', ':'])
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

@jbs: Sowas habe ich auch erst überlegt - ich glaube aber, dass es effizienter ist, nicht "blind" zu splitten, sondern zu prüfen, ob der Delim im String vorkommt:

Code: Alles auswählen

def splitit(s, seps, maxsplit=-1):
    for sep in seps:
        if sep in s:
            return s.split(sep, maxsplit)
Falls man in die Verlegenheit kommt, ein paar Millionen Zeichenketten auf diese Weise trennen zu müssen, kann das sicher durchaus mal eine Sekunde ausmachen ;)
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

@jbs: Wieso setzt du 'maxsplit = -1'?

Code: Alles auswählen

>>> print 'sdljsf'.split.__doc__
S.split([sep [,maxsplit]]) -> list of strings

Return a list of the words in the string S, using sep as the
delimiter string.  If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator and empty strings are removed
from the result.
[url=http://www.proandkon.com]proandkon.com[/url]
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Weil das der Standardwert ist und besagt, dass die Zeichenkette an allen Vorkommen des Delimiters aufgetrennt wird. Ist maxsplit >= 0, wird die Zeichenkette nur an den ersten n-Vorkommen des Delimiters aufgetrennt.

Code: Alles auswählen

>>> "1,2,3".split(",",-1)
['1', '2', '3']
>>> "1,2,3".split(",",0)
['1,2,3']
>>> "1,2,3".split(",",1)
['1', '2,3']
Gruß,

brb
mzh
User
Beiträge: 295
Registriert: Dienstag 3. März 2009, 15:27
Wohnort: ZH

aha, ja war nur verwirrt, weil von Standardwert nichts in der __doc__ stand. Ist also einfach eine Stilfrage, ob der explizit mitgegeben wird.
[url=http://www.proandkon.com]proandkon.com[/url]
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

>>> ''.split(maxsplit=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: split() takes no keyword arguments
Was soll das eigentlich?!

Ich möchte ja ein ähnliches Interface wie die originalmethode haben und daher gebe ich den Wert immer mit an.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jbs hat geschrieben:

Code: Alles auswählen

>>> ''.split(maxsplit=1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: split() takes no keyword arguments
Was soll das eigentlich?!
Nicht alle in C implementierten Methoden nehmen in CPython Keywordargumente, liegt glaub ich daran dass die Argumente auf C-Ebene keine "Python-Namen" haben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Mit PyPy wär das nicht passiert :P
Antworten