Zahl in einem kurzen Text finden

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
Red Bull
User
Beiträge: 2
Registriert: Freitag 29. Mai 2009, 19:46

Hallo,
ich bin Neueinsteiger in Python und brauche eure Hilfe :).

Ich schreibe gerade ein Script für Eventscripts. Der Spieler muss einen kurzen Text eingeben. Bestehend aus einem !, einem Wort und einer Zahl. Ungefähr so: !python 234. Das Problem ist, ich weiß nicht welche Zahl (1-16000) eingegeben wird. Deshalb meine Frage, ob man das nicht irgendwie herausfinden kann? 16000x if zu benutzen... Da gibts doch bestimmt was schnelleres. Boardsuche habe ich benutzt, habs auch mit re.findall versucht. Jedoch werde ich daraus nicht schlau. Kann mir jemand einen Lösung für Neueinsteiger geben?

Vielen dank,
Red Bull
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

mit re bist du schon richtig, schau mal hier:
http://www.amk.ca/python/howto/regex/

eine (ganz)zahl findest zb mit diesem ausdruck:

Code: Alles auswählen

[0-9]+
http://www.kinderpornos.info
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Wenn sicher ist, dass bei der Eingabe ein Leerzeichen gelassen wird, genügt auch das:

Code: Alles auswählen

>>> txt = "!python 234"
>>> txt.split()[-1]
'234'
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Variante von numerix:

Code: Alles auswählen

s,n="!python 234".split()
print n
Red Bull
User
Beiträge: 2
Registriert: Freitag 29. Mai 2009, 19:46

Danke für eure Antworten. Ja, es ist sicher, dass bei der Eingabe ein Leerzeichen gelassen wird. Ich werde aus euren Beispielen aber net schlau. Wofür steht z.B. das s,n. Könntet ihr eine beschreibung ranhängen für Newbies wie mich? Sry, aber ich verstehe echt nur Bahnhof, wie das funktionieren soll. Mit split splittet man doch irgendwas, oder liege ich da falsch?

Greetz,
Red Bull
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Red Bull: Du willst dringend das Tutorial durcharbeiten! Außerdem solltest Du Dir angewöhnen, in die Doku zu gucken und Dir Infos zu den gegebenen Funktionen durchzulesen. Dann wüßtest Du, was split macht. Alternativ in iPython:

Code: Alles auswählen

In [2]: help("".split)
Help on built-in function split:

split(...)
    S.split([sep [,maxsplit]]) -> list of strings

    Return a list of the words in the string S, using sep as the
    delimiter string.  If maxsplit is given, at most maxsplit
    splits are done. If sep is not specified or is None, any
    whitespace string is a separator and empty strings are removed
    from the result.
Wie Du weiter oben geschrieben hast handelt es sich bei dem zu parsenden Ausdruck um eine menschliche Eingabe - wie ist da sicher gestellt, dass der User sich an die Konvention hält? Ich halte hier die Anwendung eines RegExps sauberer.

Zu guter letzt ist es doch schneller, einfach mal trivial Beispiele in einer Python Shell (wie eben iPython oder auch die Standard-Shell) auszuprobieren, als hier zu fragen, was split() nun genau macht ;-)
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Noch kurz zwei Dinge.

s und n sind zwei beliebige Bezeichner, die ich verwende um dann direkt auf die Listenelemente zugreifen zu können und nicht über einen Index wie bei numerix' Beispiel. Könnte auch Adam und Eva sein.
Es muß allerdings sicher sein, daß split hier eine Liste aus exakt zwei Elementen zuückgibt. Sonst handelst Du Dir eine Exception ein.

Na ja. Tutorial ist empfehlenswert. Ist noch kein Meister vom Himmel gefallen.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Code: Alles auswählen

In [1]: a = "!python 123"
In [6]: print int("".join(x for x in a if "0" <= x <= "9"))
Du könntest dir noch die Position mithilfe von enumerate() zurückgeben lassen (also einen Tupel aus <index>, <zahlencharacter>) und die Angaben nutzen, um zu überprüfen, ob die Zahlen an der richtigen Stelle eingetippt wurden. Überhaupt solltest du das so direkt nicht benutzen, denn es reiht jede beliebige Zahl im String direkt aneinander.
Antworten