Testen ob irgendeine sechsstellige Zahl in String vorkommt

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.
markus073
User
Beiträge: 5
Registriert: Sonntag 31. Mai 2009, 10:16

Ich habe einen String, und möchte gerne herausfinden ob irgendeine sechsstellige Zahl darin vorkommt.
Könnte mir jemand, falls möglich, einen Ansatz geben? Z.B. den Namen einer Funktion mit der das geht. Danke 8)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Schau dir mal das ``re``Modul an. Je nachdem wie dein String aussieht, braucht man aber vllt. nicht mal re...
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Code: Alles auswählen

>>> foo = 'ein string, in dem eine sechstellige zahl vorkommt: 123456 und noch ein paar woerter'
>>> filter(lambda char: char in digits, foo)
'123456'
>>> len(filter(lambda char: char in digits, foo)) == 6
True
yantur_v_b
User
Beiträge: 17
Registriert: Montag 25. Mai 2009, 10:32

markus073 hat geschrieben:Ich habe einen String, und möchte gerne herausfinden ob irgendeine sechsstellige Zahl darin vorkommt.
Wenn es wirklich nur darum geht...

Code: Alles auswählen

if str(sechstellige_zahl) in String_der_Wahl:
   print "Zahl kommt im String vor"
else:
   print "Zahl kommt im String nicht vor"
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Die Betonung liegt aber auf *irgendeine* ;)
fred.reichbier
User
Beiträge: 155
Registriert: Freitag 29. Dezember 2006, 18:27

derdon, dein Code funtktioniert aber auch für "ein string, in dem eine zweistellige: 12 und eine vierstellige zahl vorkommt: 3456" ;)
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Stimmt. REs sind einfach die bessere Wahl.
markus073
User
Beiträge: 5
Registriert: Sonntag 31. Mai 2009, 10:16

Besten Dank in die Runde für die Tipps.

Habs jetzt so gemacht

Code: Alles auswählen

import re
foo = 'ein string, in dem eine sechstellige zahl vorkommt: 012345 noch ein paar woerter'
if re.search('\d\d\d\d\d\d', foo): 
    print "ja, kommt drin vor!"
"\d" steht ja in RegEx für eine Ziffer.
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Für die Regex aber lieber '\d{6}'. ;)
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Und sollte sie öfter aufgerufen werden (Schleife etc.), dann sollte man die Regular Expression kompilieren.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Oder so :roll: :

Code: Alles auswählen

>>> import string
>>> import itertools
>>> any("".join(x) in "ich bin ein string mit 123456 einer sechstelligen zahl" for x in itertools.product(string.digits, repeat=6))
True
>>> any("".join(x) in "ich bin ein string mit 12345 einer sechstelligen zahl" for x in itertools.product(string.digits, repeat=6))
False
Das Leben ist wie ein Tennisball.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

lol, man kann's sicher "noch" verständlicher und einfacher machen...^^
Benutzeravatar
snafu
User
Beiträge: 6862
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

EyDu hat geschrieben:Oder so :roll: :
PEP 8, PEP 8! :evil:
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

auf die naheliegenste lösung ist mal wieder keiner gekommen:

Code: Alles auswählen

def check_zahl_drin(eingabe):
    for zahl in xrange(int(1e6)):
        if str(zahl) in eingabe: 
            return True
afaik PEP8 konform :!:
Zuletzt geändert von Dill am Mittwoch 10. Juni 2009, 17:57, insgesamt 1-mal geändert.
http://www.kinderpornos.info
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dill hat geschrieben:afaik PEP8 konform :!:
*hust* PEP 8 sagt, dass Funktionen/Methoden Verben sein sollten ;) Und englisch ;)

Daneben ist das ziemlich hungrig, v.a. im Vergleich zur RegExp
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

besser? 8)

hungrig ist er jetzt nichtmehr (wenn ich xrange richtig verstanden habe. evtl etwas gemütlich, aber in der ruhe liegt die kraft)
http://www.kinderpornos.info
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

snafu hat geschrieben:
EyDu hat geschrieben:Oder so :roll: :
PEP 8, PEP 8! :evil:
Wer den interaktiven Interpreter benutzt darf PEP 8 ignorieren. 8)

@Dill: denk mal drüber nach: "spam 1234 eggs" und "keine zahl drin" :wink:
Das Leben ist wie ein Tennisball.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

es kann durchaus vorkommen, dass in einem solch komplexen stück software noch ein, zwei bugs zu finden sind.
dafür gibts ja patch-days.

Code: Alles auswählen

def check_sechsstellige_zahl_drin(eingabe): 
    for zahl in xrange(int(1e5), int(1e6)): 
        if str(zahl) in eingabe: 
            return True 
nach intensiven tests wurde ausserdem festgestellt, dass sich die geschwindigkeit um nahezu exakt 10% verbessert hat. das ist fortschritt.
Zuletzt geändert von Dill am Mittwoch 10. Juni 2009, 18:31, insgesamt 1-mal geändert.
http://www.kinderpornos.info
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Oder, zwei Patchdays: "keine zahl drin". (hatte noch ein Edit, daher hast du es wahrscheinlich nicht bemerkt)
Das Leben ist wie ein Tennisball.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

ich kann dir nicht folgen. falls du auf deinem standpunkt bestehst muss ich evtl nen externen consultant für ein code-review reinholen...

bei beiden deiner testfälle wird die funktion None zurückgeben.
ist das zu unklar (im kontrast zu dem True)?
stimmt, das ist nicht schön, muss aber nicht gepatched werden. kommt in ver 2.0.
http://www.kinderpornos.info
Antworten