Seite 1 von 1

Teilstring auslesen

Verfasst: Donnerstag 13. Januar 2005, 07:50
von Gast
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.

Verfasst: Donnerstag 13. Januar 2005, 13:29
von Leonidas

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.

Verfasst: Donnerstag 13. Januar 2005, 13:36
von Dookie
Hi Markus,

oder mit re:

Code: Alles auswählen

import re

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

Gruß

Dookie

Verfasst: Donnerstag 13. Januar 2005, 14:09
von Leonidas
Ich muss mich wiedermal Dookie's Lösung beugen kürzer, logischer, übersichtlicher, weniger gehackt. :)
Außer man mag keine Regex.

Danke!

Verfasst: Samstag 15. Januar 2005, 14:13
von Markus
Danke für die Hilfe! Sorry, habe gerade angefangen Python zu lernen. Werde mich jetzt mal intensiver den RegExs zuwenden ;-)

Markus

Re: Danke!

Verfasst: Samstag 15. Januar 2005, 14:39
von Leonidas
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.

Verfasst: Montag 2. Mai 2005, 11:20
von murphy
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 ;)

Verfasst: Montag 2. Mai 2005, 12:37
von Leonidas
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 :)

Verfasst: Montag 2. Mai 2005, 12:49
von mawe
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

Verfasst: Freitag 14. Oktober 2005, 08:54
von jens
Außerdem sind re-Geschichten meist langsamer, als wenn man es ausgefeilt "zu Fuss" macht... oder?

Verfasst: Freitag 14. Oktober 2005, 14:27
von Leonidas
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.

Verfasst: Freitag 14. Oktober 2005, 23:00
von BlackJack
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.

Verfasst: Samstag 15. Oktober 2005, 07:13
von jens
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.