ubuntuusers.de

Problem mit nem Regex bei Python

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

snafu1

Avatar von 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

Avatar von Der_Gestreifte

Anmeldungsdatum:
21. Juni 2007

Beiträge: 1261

Wohnort: Nürnberg

"re.split()" wäre keine Option?

snafu1

(Themenstarter)
Avatar von snafu1

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)
Avatar von snafu1

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

Avatar von Blattlaus

Anmeldungsdatum:
29. März 2006

Beiträge: 1399

"das_ist_toll".split("_") → ['das', 'ist', 'toll]

snafu1

(Themenstarter)
Avatar von snafu1

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)
Avatar von snafu1

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

Avatar von 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)
Avatar von snafu1

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

Avatar von 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)
Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Ui, range() sieht aber auch sehr praktisch aus, wenn ich mal Sachen nummerieren muss. ☺

audax

Avatar von 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)
Avatar von snafu1

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

Avatar von 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

😉

Antworten |