Teilstring auslesen

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
Gast

Donnerstag 13. Januar 2005, 07:50

Sorry, ich hab' irgendwie keine passende Kategorie im Forum entdeckt.

Ich suche einen Code-Ausschnitt, der alle zwischen zwei Teilstrings liegenden Teile ausliest und in eine Liste fügt. Beispiel

string = abcadcaec

Alle Elemente die zwischen 'a' und 'c' liegen

Ergebnis : ['b', 'd', 'e']

Wäre schön, wenn mir jemand einen Tipp geben könnte.

Markus

Edit (Leonidas): In Allgemeine Fragen verschoben.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 13. Januar 2005, 13:29

Code: Alles auswählen

s = "abcadcaec"
s2 = s[s.find('a')+1:s.rfind('c')]
s3 = s2.replace('c', '').replace('a', '')
list(s3)
Nur mal in Eile zusammengeschrieben, hängt natürlich ab, wie flexibel du es willst.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 13. Januar 2005, 13:36

Hi Markus,

oder mit re:

Code: Alles auswählen

import re

txt = "abcadcaec"
res = re.findall("a([^c]*)", txt)
print res

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 13. Januar 2005, 14:09

Ich muss mich wiedermal Dookie's Lösung beugen kürzer, logischer, übersichtlicher, weniger gehackt. :)
Außer man mag keine Regex.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Markus

Samstag 15. Januar 2005, 14:13

Danke für die Hilfe! Sorry, habe gerade angefangen Python zu lernen. Werde mich jetzt mal intensiver den RegExs zuwenden ;-)

Markus
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Samstag 15. Januar 2005, 14:39

Markus hat geschrieben:Danke für die Hilfe! Sorry, habe gerade angefangen Python zu lernen. Werde mich jetzt mal intensiver den RegExs zuwenden ;-)
Die sind auch nicht so wichtig, solange du nicht zu ausgefallene Strings zerlegen willst, Python ist ja kein Perl oder Ruby.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
murphy
User
Beiträge: 60
Registriert: Samstag 30. Oktober 2004, 01:34
Wohnort: Berlin
Kontaktdaten:

Montag 2. Mai 2005, 11:20

ich vermute mal, Guido Van Rossum (hat der einen spitznamen?) wollte keine /regexps/ in seiner sprache, weil man sie in Perl gern zulasten der performance aus faulheit benutzt. "import re" zwingt den programmierer, etwas mehr nachzudenken.

aber wenn ich mir die beispiele oben anschaue, frage ich mich, ob das wirklich sinnvoll war.
Leonidas hat geschrieben:Die sind auch nicht so wichtig, solange du nicht zu ausgefallene Strings zerlegen willst, Python ist ja kein Perl oder Ruby.
stimmt, in Ruby kommt man keine 2 meter weit ohne regexps, weil

Code: Alles auswählen

puts 'Moth found in Relay #70 Panel F'[/\w{5}/]  #-> found
so schön kurz ist. aber natürlich kann man auch in Ruby so etwas machen:

Code: Alles auswählen

s = 'abcadcaec'
s2 = s[s.index('a')+1...s.index('c')]
s3 = s2.sub('c', '').sub('a', '')
puts s3
macht aber keiner.

andere funktionen wie startswith fehlen in Ruby leider. hoffentlich schaut man sich die noch von Python ab ;)
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 2. Mai 2005, 12:37

murphy hat geschrieben:andere funktionen wie startswith fehlen in Ruby leider. hoffentlich schaut man sich die noch von Python ab ;)
Sind auch erst letztens in Python reingekommen :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Montag 2. Mai 2005, 12:49

Hi!

Weil Python ja für das Motto There's only one way to do it berüchtigt ist, hier noch eine (sehr intelligente *räusper*) Variante:

Code: Alles auswählen

>>> x = "abcadcaec"
>>> [i.lstrip('a') for i in x.split('c') if i]
['b', 'd', 'e']
Gruß, mawe
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 14. Oktober 2005, 08:54

Außerdem sind re-Geschichten meist langsamer, als wenn man es ausgefeilt "zu Fuss" macht... oder?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 14. Oktober 2005, 14:27

Nicht immer.. aber Performance spielt doch bei Python sowieso eher eine untergeordnete Rolle. Readability counts. Es ist ja auch soft so, dass eine ausgefeilte Methode auch manchmal durch ein Regex ausgedrückt werden kann, was die aufgabe dann doch einfacher löst. Hängt halt vom Verwendungszweck ab.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Freitag 14. Oktober 2005, 23:00

jens hat geschrieben:Außerdem sind re-Geschichten meist langsamer, als wenn man es ausgefeilt "zu Fuss" macht... oder?
Ausgefeilt "zu Fuss" würde "in Python" bedeuten, also "kämpft" man schon mal gegen eine re-Implementierung in C an. Und dann sind re-Implementierungen auf Suchen von Zeichenketten spezialisiert. Ein regulärer Ausdruck ohne die ganzen "Sonderzeichen" kann unter Umständen sogar schneller sein als die "naive" Suche die man mit `str.find()` bekommt.

Hier gilt wie bei allen Leistungsfragen: Messen, messen und nochmals messen.
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 15. Oktober 2005, 07:13

Als beispiel meinte ich unsere suche nach den optimalsten formatter: http://www.python-forum.de/viewtopic.php?t=371

Dabei waren die Varanten mit re, langsamer als eine Lösung zu fuss.
Wobei in dem Beispiel auch die Datenmende extrem klein ist, fällt mir gerade mal so ein.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten