ich möchte eine Zahl vom Anfang eines Strings auslesen. Der String sieht zum Beispiel so aus aus "12Akajnajfaj34fjakfjka5kjkj". Jetzt möchte ich nur noch die 12 haben. Wie geht das am einfachsten?
Danke

Code: Alles auswählen
In [5]: import re
In [6]: res = re.search(r"\d+", "12Akajnajfaj34fjakfjka5kjkj")
In [7]: res.group()
Out[7]: '12'
Code: Alles auswählen
a = "12Akajnajfaj34fjakfjka5kjkj"
b = ""
while len(a) > 0 and a[0].isdigit():
b += a[0]
a = a[1:]
print b
Code: Alles auswählen
In [36]: a = "12Akajnajfaj34fjakfjka5kjkj"
In [37]: b = ''
In [38]: for c in a:
....: if c.isdigit():
....: b += c
....: else:
....: break
....:
In [39]: b
Out[39]: '12'
Code: Alles auswählen
In [33]: def break_():
....: raise StopIteration
....:
In [34]: a = "12Akajnajfaj34fjakfjka5kjkj"
In [35]: ''.join(c if c.isdigit() else break_() for c in a)
Out[35]: '12'
Stimmt, das gefällt mir auch viel besser.gkuhl hat geschrieben:Code: Alles auswählen
In [36]: a = "12Akajnajfaj34fjakfjka5kjkj" In [37]: b = '' In [38]: for c in a: ....: if c.isdigit(): ....: b += c ....: else: ....: break
Was heißt "Python" vermeidet etwas? Der Interpreter? Die Sprache an sich? Belege?problembär hat geschrieben: Andererseits vermeidet Python soweit wie möglich reguläre Ausdrücke und verwendet stattdessen besser lesbare Funktionen wie ".startswith()" oder ".replace()".
Oha... eine schlechtere Lösung ist kaum vorstellbar! Das Laufzeitverhalten davon ist furchtbar, vom Speicherverbrauch mal abgesehen. Ist Dir klar, was da alles passiert im einzelnen?problembär hat geschrieben: Ich könnte mir also auch sowas vorstellen:Code: Alles auswählen
a = "12Akajnajfaj34fjakfjka5kjkj" b = "" while len(a) > 0 and a[0].isdigit(): b += a[0] a = a[1:] print b
Code: Alles auswählen
In [46]: res = []
In [47]: for c in data:
....: if c.isdigit():
....: res.append(c)
....: else:
....: break
....:
....:
In [48]: res
Out[48]: ['1', '2']
In [49]: "".join(res)
Out[49]: '12'
Code: Alles auswählen
In [44]: from itertools import takewhile
In [45]: "".join(takewhile(lambda c: c.isdigit(), data))
Out[45]: '12'
Code: Alles auswählen
In [101]: ''.join(takewhile(methodcaller('isdigit'), a))
Out[101]: '12'
Yihaaa! Zum ersten Mal BlackJack "geschlagen"BlackJack hat geschrieben: Edit: Mist, zu langsam.
nomnom hat geschrieben:Vielleicht, weil es Methoden und keine Funktionen aufruft?Hyperion hat geschrieben:Wieso eigentlich `method` und nicht `function`?
Ist das besser alsBlackJack hat geschrieben:Code: Alles auswählen
In [101]: ''.join(takewhile(methodcaller('isdigit'), a))
Code: Alles auswählen
''.join(takewhile(str.isdigit, a))
Code: Alles auswählen
In [14]: a = u'12'
In [15]: ''.join(takewhile(methodcaller('isdigit'), a))
Out[15]: u'12'
In [16]: ''.join(takewhile(str.isdigit, a))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
/home/lunar/<ipython-input-16-112f36c1e07f> in <module>()
----> 1 ''.join(takewhile(str.isdigit, a))
TypeError: descriptor 'isdigit' requires a 'str' object but received a 'unicode'