String splitten

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
x1334
User
Beiträge: 13
Registriert: Mittwoch 13. Juni 2012, 12:34

Hallo.

Ich versuche einen String zu splitten, der so aussieht: "abarbeitenKostenpunkt" - logischerweise an der Stelle, an der der Großbuchstabe steht.
Habe es mit re.split versucht aber das löscht leider den Splitchar. (['abarbeiten', 'ostenpunkt'])

Wie komme ich denn hier weiter?

Danke für die Hilfe!
BlackJack

@x1334: Ich würde sagen das geht mit `re.split()` nicht. Du könntest alle Teilzeichenketten *suchen* die entsprechend aussehen:

Code: Alles auswählen

In [281]: s
Out[281]: 'abarbeitenKostenpunkt'

In [282]: re.findall(r'[A-Z]?[^A-Z]+', s)
Out[282]: ['abarbeiten', 'Kostenpunkt']
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Ersetz doch alle Großbuchstaben durch ein Leerzeichen + den selbigen Großbuchstaben.
x1334
User
Beiträge: 13
Registriert: Mittwoch 13. Juni 2012, 12:34

Und wie mache ich das?
Bekomme es gerade echt nicht hin :(

string.replace("A", " "+ "A") - das funktioniert aber wie mache ich das für alle uppercasebuchstaben auf einmal?
Zuletzt geändert von x1334 am Mittwoch 15. August 2012, 17:48, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das wäre ja auch umständlich... erst einen neuen String bauen, um den dann wieder zu zerlegen... :shock:

BlackJack hat Dir doch einen netten Weg gezeigt, wie man das Problem lösen kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Oder man schreibt sich eben eine Funktion

Code: Alles auswählen

def split(s, key):
    rv = []
    start = 0
    for i, char in enumerate(s):
        if key(char):
            rv.append(s[start:i])
            start = i
    rv.append(s[start:])
    return rv


print split("halloWelt", key=lambda char: char.isupper())
[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]
BlackJack

@jbs: Dann darf die Zeichenkette nicht mit einem Grossbuchstaben anfangen:

Code: Alles auswählen

In [289]: split('HalloWelt', key=lambda char: char.isupper())
Out[289]: ['', 'Hallo', 'Welt']
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Es orientiert sich am Verhalten von split:

Code: Alles auswählen

>>> re.split("[A-Z]", "HalloWelt")
['', 'allo', 'elt']
[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]
BlackJack

@jbs: Na das ist deswegen (und wegen den verschluckten Buchstaben) ja auch genau so wenig zu gebrauchen.
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Es hat eine anadere Semantik. Statt "ich suche Teilstrings" ist es ein "ich möchte Strings splitten, aber das Gesplittete behalten".
[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]
BlackJack

@jbs: Ich weiss jetzt nicht was Du mir damit sagen willst. Also ich verstehe den Satz schon, finde ihn aber ähnlich hilfreich wie „Frösche sind grün” zu diesem Thema. Oder gehst Du tatsächlich davon aus das eine leere Zeichenkette am Anfang des Ergebnisses tatsächlich gewünscht ist‽
Antworten