snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Hi! Ich will nen reg. Ausdruck bauen um mit Python Elemente rauszufiltern, die durch Unterstriche getrennt sind, aber ich schaffe es nicht das letzte Element auszulesen: >>> test = 'das_ist_toll'
>>> re.findall('(.*?)_', test)
['das', 'ist']
>>> re.findall('_(.*?)', test)
['', '']
>>> re.findall('_(.*)', test)
['ist_toll'] Zugeben ein bißchen rumprobiert, weil ich Regexe nocht nicht hundertprozentig verstanden habe. Offenbar geht er den bereits gefunden String ja nicht nochmal durch und findet deshalb keinen weiteren Unterstrich. Kann mir jemand nen Tipp geben, wie ich auch den letzten Teil in die Liste kriege?
|
MrKanister
Anmeldungsdatum: 13. Oktober 2007
Beiträge: 2105
|
Eventuell
'.*_([^_]*)$' ? Ist aber nur für das letzte Element alleine.
Ich "regexxe" zwar sonst nur in der bash, aber Regexxen ist ja überall identisch 😉 Gruß Martin
|
Der_Gestreifte
Anmeldungsdatum: 21. Juni 2007
Beiträge: 1261
Wohnort: Nürnberg
|
"re.split()" wäre keine Option?
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Noch sauberer wäre ja ein Pendant zu "cut" in der Bash. Gibt es da eins?
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Der Gestreifte hat geschrieben: "re.split()" wäre keine Option?
Exakt sowas suchte ich. Danke!
|
Blattlaus
Anmeldungsdatum: 29. März 2006
Beiträge: 1399
|
"das_ist_toll".split("_") → ['das', 'ist', 'toll]
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Bei der Ausgabe ist es aber komisch. Wie kommt es denn, dass er mal quotet und mal nicht? >>> test = 'das_ist_toll'
>>> splitten = re.split('_', test)
>>> i = iter(splitten)
>>> for element in i:
... print element
... try:
... i.next()
... except StopIteration:
... break
...
das
'ist'
toll
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Blattlaus hat geschrieben: "das_ist_toll".split("_") → ['das', 'ist', 'toll]
Gibt es einen Unterschied zwischen so machen wie du beschrieben hast und meiner Variante mit re?
|
audax
Anmeldungsdatum: 15. September 2006
Beiträge: 1253
|
>>> test = 'das_ist_toll'
>>> for n in test.split('_'):
... print n
...
das
ist
toll So macht man das 😉
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Oh, alles klar. EDIT: Ich weiss jetzt gar nicht mehr wieso ich das iterieren wollte. Voll kompliziert. 😀
|
audax
Anmeldungsdatum: 15. September 2006
Beiträge: 1253
|
das iterieren geschieht implizit bei einer for-Schleife.
>>> for i in iter(range(5)):
... print i
...
0
1
2
3
4
>>> for i in range(5):
... print i
...
0
1
2
3
4
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Ui, range() sieht aber auch sehr praktisch aus, wenn ich mal Sachen nummerieren muss. ☺
|
audax
Anmeldungsdatum: 15. September 2006
Beiträge: 1253
|
Dafür nimmst du aber bitte enumerate :
>>> for count, elem in enumerate(["foo", "bar", "foobar"]):
... print count, elem
...
0 foo
1 bar
2 foobar Alles weitere steht in der Doku.
|
snafu1
(Themenstarter)
Anmeldungsdatum: 5. September 2007
Beiträge: 2133
Wohnort: Gelsenkirchen
|
Mich hat nur gestört, dass er mit Null anfängt. Habe aber relativ schnell ne Lösung gefunden: >>> from itertools import izip, count
>>> for count, elem in izip(count(1), ['foo', 'bar', 'foobar']):
... print count, elem
...
1 foo
2 bar
3 foobar
|
audax
Anmeldungsdatum: 15. September 2006
Beiträge: 1253
|
>>> for count, elem in enumerate(["foo", "bar", "foobar"]):
... print count+1, elem
...
1 foo
2 bar
3 foobar 😉
|