substring in string

  • Jetzt habe ich eine Stunde ohne Erfolg gesucht, obwohl mein Problem mehr als simple ist


    Mein String "xxxaxxxadddaeeea"

    Ich möchte jetzt jede Position wissen an der ein "a"steht.
    4,8,12,16

    Ich bin offensichtlich zu blöde ein solches Problem in deutsch oder englisch zu beschreiben.

    Die Anzahl ist einfach, 4, aber wo sind sie?

    VM

  • Ich habe mir alle Funktionen angesehen aber ich bin zu BLÖDE es zu begreifen.

    Ich übe jetzt über ein Stunde.
    Wie wäre es denn mit einer Zeile von Euch klugen Köpfen?
    Dann zeigt mal was Ihr so draufhabt.

    Das ganze kommt mit vor hier, immer häufiger, wie die Szene wenn einer nach dem Weg zum Bahnhof fragt und bekommt als Antwort: Schauen Sie doch einfach in den Stadtplan.

    Und um das Problem abzuschliessen, ich möchte gerne beginnend bei jedem "a" 3 Zeichen extrahieren.

    VM

  • Wie wäre es denn mit einer Zeile von Euch klugen Köpfen?
    Dann zeigt mal was Ihr so draufhabt.

    Das ganze kommt mit vor hier, immer häufiger, wie die Szene wenn einer nach dem Weg zum Bahnhof fragt und bekommt als Antwort: Schauen Sie doch einfach in den Stadtplan.

    Tja, tut mir ja leid, aber ich denke nicht, dass wir dir hier deine Hausaufgaben machen...

    Und mit diesem "zeigt mal..." hast du dich aus meinem Hilfstarget entfernt.

    Das Forum dient zur Hilfe, wenn etwas klemmt. Oder als Hilfe zur Selbsthilfe. Oder zum Anstoßen in die "richtige" Richtung... (es gibt immer mehrere Wege nach Rom).

    Wenn du Code hast, der nicht läuft, versuchen wir zu helfen, klare Sache.
    Alle hier stellen ihrer Freizeit mit der Beantwortung von Fragen und Problemen (unentgeldlich) zur Verfügung...

    nun denn...

  • Anbei eine Möglichkeit der Implementierung.

    Code
    print [e.group(1) for e in re.finditer("%s(.{3})" % "a", "xxxaxxxadddaeeea")]

    Als Ergebnis erhältst Du

    Code
    ['xxx', 'ddd', 'eee']

    Dabei werden immer die 3 folgenden Zeichen nach einem a gesammelt. Deshalb kommt beim letzten a nichts.

  • Hallo Kollegen,

    ich verfolge diesen Thread jetzt schon eine Zeit und habe mir überlegt, ob ich einen Beitrag schreiben soll oder nicht... Die Entscheidung ist gefallen.

    Marinella ist kein Schüler, der von uns die Hausaufgaben gemacht bekommen möchte. VillaMarinella ist 67 Jahre alt und beschäftigt sich seit gefühlt 1,5 Jahren mit dem Raspberry Pi. Zuerst in Thailand (wenn ich es richtig in Erinnerung habe) und jetzt in Deutschland.

    Ich bin auch kein Freund davon, ohne erkennbare Eigeninitiative mit Code um mich zu schmeißen. Wenn man sich aber anschaut, was VillaMarinella alles schon an Projekten rund um den Raspberry Pi gestemmt hat und überwiegend nur durch Intensiv-Recherche, buy-and-trial etc. Ein ganz aktuelles Beispiel - ganz sicher nicht das Deutlichste - aber man kann Eigeninitiative und großes Bemühen erkennen: Link


    Ich mach's kurz. Wenn ich Python können wollte, dann würde ich den Code - und zwar fehlerfrei - herausrücken.

    Mit 'nem Einzeiler in Icon ist hier leider nicht gedient. :stumm:


    Zentris & Framp: Ich schätze Euch beide sehr - aber ich würde mich in Grund und Boden sch..... 67 und motiviert... Kommt, rückt die Zeile raus...

    Geht mal in Euch!


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    2 Mal editiert, zuletzt von Andreas (15. Oktober 2017 um 11:44)

  • Hallo Framp,

    Es gibt leider auch Kollegen die genau das hier machen - Aufgaben von uns lösen lassen.

    Das weiß ich! Und Ich weiß, dass Du weißt, dass ich da auch sehr allergisch reagiere, jemandem Unmotiviertem Hausaufgaben zu lösen oder bei Semesterarbeiten zu unterstützen. In die richtige Richtung stoßen ist OK.


    Ich habe den Code oben korrigiert :)


    :bravo2::danke_ATDE:

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo,

    in diesem Thread bei Stack OVerflow (http://stackoverflow.com/questions/1769…ng-it-in-python) findet man mehrere Dutzend Lösungen :)

    Im die Indizes zu bekommen:

    [code=php]>>> my_string = 'xxxaxxxadddaeeea'
    >>> indices = [i for i, j in enumerate(my_string) if j=='a']
    >>> indices
    [3, 7, 11, 15][/php]

    Mit der Liste kann man dann auch die folgenden drei Zeichen aus dem String ziehen. Das Stichwort heißt: slicing.
    Wenn man nur die drei Zeichen nach `a` haben will ist framp's Lösung besser.

    villamarinella: Python hat, wie viele anderen Programmiersprachen auch, einen zero-based Index. Wenn du also die Position nach "menschlicher" Zählweise (bei 1 beginnend) brauchst, musst du halt noch +1 rechnen.

    Gruß, noisefloor

  • Anbei noch ein paar nicht so kurze Lösungsmöglichkeiten, die aber sicherlich leichter zu verstehen sind:
    [code=php]#!/usr/bin/python

    suchString="xxxaxxxadddaeeea"
    suchZeichen="a"

    ergebnis=[]
    for i in range(0,len(suchString)):
    if suchString[i] == suchZeichen:
    zeichen=suchString[i+1:i+4]
    if zeichen:
    ergebnis.append(suchString[i+1:i+4])
    print "Alt1: %s" % ergebnis

    ergebnis=[]
    for (i,c) in enumerate(suchString):
    if c == suchZeichen:
    zeichen=suchString[i+1:i+4]
    if zeichen:
    ergebnis.append(suchString[i+1:i+4])
    print "Alt2: %s" % ergebnis

    ergebnis=[suchString[i+1:i+4] for (i,c) in enumerate(suchString) if c == suchZeichen and suchString[i+1:i+4]]
    print "Alt3: %s" % ergebnis
    [/php]

  • Hallo,

    framp: das Slicing liefert doch nicht das gewünschte Ergebnis?! Mal abgesehen davon, dass mit `range()` oder ein Iterable iterieren nicht so schön ist ;)

    So funktioniert es jedenfalls bei mir mit Python 3.4:

    [code=php]>>> my_char = 'a'
    >>> my_string = 'xxxaxxxadddaeeea'
    >>> result = []
    >>> for i, j in enumerate(my_string):
    ... if j==my_char:
    ... chars = my_string[i+1:i+4]
    ... if chars:
    ... result.append(chars)
    ...
    >>> result
    ['xxx', 'ddd', 'eee'][/php]

    Oder stilistisch wertvoll als List Comprehension:

    [code=php]result=[my_string[i+1:i+4] for i, j in enumerate(my_string) if j=='a' if my_string[i+1:i+4]][/php]

    Gruß, noisefloor

  • Erst einmal vielen Dank für die Antworten.

    Bis morgen früh um 6 werde ich etwas implementiert haben.

    Ich bin zwar erst 9 Monate auf der Raspi / Linux Schiene, habe aber vorher 30 Jahre meine Brötchen mit Programmierung verdient. Alles bis zuletzt im MS-DOS Fenster.
    Vielleicht gehe ich daher häufig von falschen Annahmen aus. Scheinbar ist aber nichts einfacher geworden.

    Also, Thema 2 , substring aus string extrahieren kann ich im Kopf in der Sprache in der ich mein Geld verdient habe.

    raus=substr(Wodrin,Position, Länge)

    OK, die Menge der Suchbegriffe war ja einfach zu finden.

    Wie komme ich nun an die Position?

    Position = token( suche, wodrin, das wievielte ).

    Also habe ich nach was vergleichbarem gesucht. Nach einem Einzeiler!
    Wie ich nun sehe ist es nicht so einfach. dazu kommt das sich viele, viele von denen die sich berufen fühlen im Internet kluge Ratschläge zu geben die einfachsten Regeln der Wissensweitergabe vergessen haben.
    Gefühlt 100 Seiten gelesen auf denen haarklein erklärt wurde wie das erste Auftreten gefunden wird. Niemand hat sich für das zweite... Auftreten interessiert.
    Speziell bei diesem Thema ist es mir heute auch aufgefallen das ich zum Beispiele viel Code gesehen habe , kompliziert, verschachtelt aber das Ergebnis wurde nicht dargestellt. Als was nutzt es mir, der ich was lernen will? Soll ich erst den Code eintippen um zu sehen was nun als Ergebnis dabei rauskommt? Das setzt ja voraus das ich den Code verstehe. Nur, würde ich den Code verstehen, was sollte ich dann da?
    Ich habe heute z. B. nach fast einer Stunde es aufgegeben mplayer auf /dev/video1 abspielen zu lassen.
    20 Leute haben exact den gleichen Befehl gepostet bei dem ich nur Fehler bekommen habe. Auch die Suche nach dem Begriff device in der man Page ergab kein Ergebnis. Ich habs schliesslich gelassen.
    Bevor ich also hier um Hilfe bitte habe ich schon Stunden hinter mir.
    Und das ich dabei nicht so erfolgreich bin wie sich manche sich das vorstellen, das möge man mir verzeihen.

    Und je mehr ich mich mit alle den weiteren Programmiersprachen beschäftige um so mehr weiss ich heute was für eine komfortable Sprache ich all die Jahre benutzt habe. OK, halt keine Zeile Grafik. Daher viel mir ja der Umstieg auf Linux nicht schwer. Aber z. B. eine Bibliothek mit Stringmanipulationen die ich hatte, davon würde mancher heute träumen.
    Ich habe komplette Datenbankapplikationen entwickelt und habe einen Datendurchsatz von locker 5 Mio / Stunde auf einem simplen PC im MS-DOS Fenster erreicht. Meine Datenbanken hatten zuletzt einen Umfang von ca. 7 Milliarden Datensätzen. Und alles Strings! Da darf man schon mal ungeduldig werden wenn sich die Suche nach einer "einfachen" Sache als so kompliziert erweist.

    Bis hierher erst einmal DANKE an alle.

    Ich werde den Vollzug melden.

    VM
    Automatisch zusammengefügt:

    @ framp

    Und ja, dieser Einzeiler reicht schon völlig aus.
    Was bedeutet die 1 in der Klammer von e.group?

    Und wenn ich das richtig interpretiere ist das Ergebnis ein Array in dem ich die einzelnen Ergebnisse separat abrufen kann um sie dann weiter zu verarbeiten.

    Ungefähr so
    Ich weiss ja wieviel da sind

    array = e.group
    for i = 1 to x
    satz = array
    next

    Und ja, ich habe diese Funktion auch schon vorher gefunden, siehe hier:

    re.finditer (pattern, string, flags=0)

    Nur habe ich sie nicht verstanden, und ich habe nach einer Erklärung für flag gesucht und nicht gefunden.
    Und das hat ja mit Deiner Funktion auf den ersten Blick wenig zu tun:-)
    Auch so ein Tutorial OHNE ein einziges Beispiel. Nutzeffekt = NULL.

    Danke, ich schaue mir aber auch noch den anderen Code an.

    VM

    PS: Eine Frage bleibt, Du erzeugst ein Array mit Daten. Kann das überlaufen?



    Automatisch zusammengefügt:

    @ noisefloor

    Grundsätzlich ist Deine Antwort richtig bezogen auf meine erste "unklare" Frage.


    Die habe ich bewusst einfach gehalten, natürlich suche ich nicht nach nur einem Buchstaben, sorry, hätte ich deutlicher machen müssen. Nur habe ich nach String gefragt, nicht nach Character.

    Daher kommen keine Ergebnisse wenn der Suchstring mehr als ein Zeichen hat.

    Trotzdem, Danke

    VM

    Einmal editiert, zuletzt von villamarinella (29. März 2016 um 06:01)

  • So, als Dankeschön hier meine Hausaufgaben.
    Das Programm liest aus einer bestimmten Gruppe von Webseiten alle Bilder aus und speichert sie. Das können von 1 bis 1000 sein, obwohl 75 kByte packt ja das Array easy, denke ich. Prinzipiell sollte man das Array absichern, aber lass es mal crashen:-)

    Und wenn man mal genau hinschaut, es gibt nur eine Zeile die nicht selbsterklärend ist!
    Ein Freund bat mich heute morgen um so ein Programm. Das alles habe ich mir also an einem Tag zusammen gesucht.
    In diesem Sinne

    frohes Gelingen an alle und Danke

    VM


  • @ framp

    Und ja, dieser Einzeiler reicht schon völlig aus.
    Was bedeutet die 1 in der Klammer von e.group?

    Und wenn ich das richtig interpretiere ist das Ergebnis ein Array in dem ich die einzelnen Ergebnisse separat abrufen kann um sie dann weiter zu verarbeiten.


    Anbei habe ich den Einzeiler auseinandergenommen und kommentiert so dass man Debugprints einfügen kann um zu analysieren was da im Einzelnen passiert. Auch habe ich dafür den regex Interator in eine explizite Loop umgebaut.

    Regex sind sehr mächtig - aber auch nicht leicht zu verstehen =( . Ich benutze sie gerne um zu testen ob irgendwelche Patterns in Strings enthalten sind oder um irgendwelche Teile aus Strings zu extrahieren. Der Unterschied zwischen group(0) und group(1) ist, dass group(0) den gesamten Match enthält (also z.B. axxx) während group(1) nur den Extract aus dem match enthält (also z.B. xxx).


    Automatisch zusammengefügt:

    framp: ... Mal abgesehen davon, dass mit `range()` oder ein Iterable iterieren nicht so schön ist ;)

    Was meinst Du damit? Ein Iterator ist doch zum Iterieren gedacht :shy:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!