Zahl in String finden (gelöst)

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.
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Zahl in String finden (gelöst)

Beitragvon Nergal » Montag 13. Oktober 2008, 08:40

Hallo,

ich bin Neuling im Umgang mit Python und habe eine sicherlich recht simple Frage.

Ich habe einen String, in dem evtl. eine Zahl vorhanden ist. Nun möchte ich diese Zahl herrausfinden und nicht den String Zeichen für Zeichen durchgehen. Gibt es dafür in Python eine schnellere Möglichkeit bzw. gibt es sowas wie ein IndexOf(...)?
Zuletzt geändert von Nergal am Montag 13. Oktober 2008, 09:11, insgesamt 1-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Beitragvon Darii » Montag 13. Oktober 2008, 08:50

Die Doku ist dein Freund.

Ansonsten geht natürlich auch immer


Code: Alles auswählen

if "12" in "Hallo Nr. 12!":
    print "Juhuu!"
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Beitragvon Nergal » Montag 13. Oktober 2008, 08:58

Danke für die schnelle Hilfe.

Das Problem ist nun nur noch, daß ich nicht im vorraus weiß, welche Zahl vorhanden ist. Format ist immer x.x.x....
BlackJack

Beitragvon BlackJack » Montag 13. Oktober 2008, 08:59

Schau mal ins `re`-Modul und dessen Dokumentation.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Beitragvon .robert » Montag 13. Oktober 2008, 09:05

ungetestet:

Code: Alles auswählen

import re
zahlen=re.findall('([0-9]*)', "text mit zahl 2 und auch ne 12 und ne 14")
print zahlen
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Beitragvon Nergal » Montag 13. Oktober 2008, 09:11

.robert hat geschrieben:ungetestet:

Code: Alles auswählen

import re
zahlen=re.findall('([0-9]*)', "text mit zahl 2 und auch ne 12 und ne 14")
print zahlen


Danke, genau das habe ich gebraucht ;)

Hab mal aus dem * ein + gemacht, da er sonst auch zich Leerstrings mitnimmt.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Beitragvon .robert » Montag 13. Oktober 2008, 09:14

Nergal hat geschrieben:Hab mal aus dem * ein + gemacht, da er sonst auch zich Leerstrings mitnimmt.

Ähm, oh ja, stimmt, "+" ist besser :oops:

(nächstes mal lasse ich das selber ein mal durchlaufen, dann fällt mir sowas auch auf :wink: )
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Beitragvon .robert » Montag 13. Oktober 2008, 09:57

Auch noch mal für Kommazahlen:

Code: Alles auswählen

import re
text = "text mit zahl 2 und auch ne 12 und ne 134364 1,3 1.5 2,56 78.545"
zahl=re.findall('\d+[,.]\d+|\d+', text)
print zahl
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Beitragvon .robert » Montag 13. Oktober 2008, 11:33

Man hat ja in der Mittagspause nichts besseres zu tun :roll:

Code: Alles auswählen

import re
text = "text mit zahl 2 und auch ne -12 und ne 134364 1,3 +1.5 -2,56 78.545"
zahl=re.findall('[+-]?\d+[,.]?\d*', text)
print zahl

:wink:
BlackJack

Beitragvon BlackJack » Montag 13. Oktober 2008, 13:03

Naja…

Code: Alles auswählen

In [255]: text = 'Die ganze Zahl 5. Hausnummer 43-45. Localhost = 120.0.0.1'

In [256]: re.findall(r'[+-]?\d+[,.]?\d*', text)
Out[256]: ['5.', '43', '-45.', '120.0', '0.1']
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Beitragvon .robert » Montag 13. Oktober 2008, 13:24

BlackJack hat geschrieben:Naja…

Ab hier müsste man mMn anfangen, genauer zu spezifizieren, was gefunden, was nicht gefunden und vor allem was wie gefunden werden soll, um die RE zu verbessern.
Was soll denn aus 43-45 werden? ['43', '45'] oder ['43-45']?
Und ist eine IP eine Zahl, oder 4 Zahlen?

Unter der gegebenen Spezifikation (einfach Zahlen finden) ist meine Lösung schon korrekt.
Alles weitere wären in meinen Augen Spezialfälle...

Aber wenn du eine bessere Lösung parat hast, würde ich die gerne sehen.
BlackJack

Beitragvon BlackJack » Montag 13. Oktober 2008, 13:47

Meine "Lösung" wäre nicht wild irgendwelche regulären Ausdrücke für ein Problem zu schreiben, das es gar nicht gibt. ;-)
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Beitragvon __marcus__ » Montag 13. Oktober 2008, 13:49

Nergal hat geschrieben:Format ist immer x.x.x....


Wobei man da schon gleich sagen kann, dass man auch wissen muss, was an Stelle dieser Punkte am Ende kommt.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Beitragvon .robert » Montag 13. Oktober 2008, 14:15

BlackJack hat geschrieben:Meine "Lösung" wäre nicht wild irgendwelche regulären Ausdrücke für ein Problem zu schreiben, das es gar nicht gibt. ;-)

Da ich mich bis jetzt erfolgreich davor gedrückt hatte, mich mit Regulären Ausdrücken zu beschäftigen, hatte ich ein ganz klein wenig gehofft, hier, vor allem weil der Threadstarter zufrieden zu seien scheint, ein wenig rum zu spielen und vor allem zu lernen zu können.
Ich hatte doch wirklich angefangen zu überlegen wie wohl eine RE aussieht, die deinen Beispielen genügt.
Tja, ich werde meine Ergebnisse dann wohl für mich behalten...
:roll:
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Beitragvon str1442 » Montag 13. Oktober 2008, 18:13

Strings haben auch die str.isdigit() methode. Dazu müsste man zwar über jedes Zeichen iterieren, aber grade die String Methoden sollen doch gegebenüber zb re deutlich schneller sein.

Code: Alles auswählen

>>> a = filter(lambda x: x.isdigit(), "Hallo152!")
>>> a
'152'

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder