Seite 1 von 2

Testen ob irgendeine sechsstellige Zahl in String vorkommt

Verfasst: Dienstag 9. Juni 2009, 21:32
von markus073
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)

Verfasst: Dienstag 9. Juni 2009, 21:39
von nemomuk
Schau dir mal das ``re``Modul an. Je nachdem wie dein String aussieht, braucht man aber vllt. nicht mal re...

Verfasst: Dienstag 9. Juni 2009, 21:45
von derdon

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

Re: Testen ob irgendeine sechsstellige Zahl in String vorkom

Verfasst: Dienstag 9. Juni 2009, 21:48
von yantur_v_b
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"

Verfasst: Dienstag 9. Juni 2009, 21:50
von derdon
Die Betonung liegt aber auf *irgendeine* ;)

Verfasst: Dienstag 9. Juni 2009, 21:59
von fred.reichbier
derdon, dein Code funtktioniert aber auch für "ein string, in dem eine zweistellige: 12 und eine vierstellige zahl vorkommt: 3456" ;)

Verfasst: Dienstag 9. Juni 2009, 22:09
von derdon
Stimmt. REs sind einfach die bessere Wahl.

Verfasst: Dienstag 9. Juni 2009, 22:22
von markus073
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.

Verfasst: Dienstag 9. Juni 2009, 22:29
von snafu
Für die Regex aber lieber '\d{6}'. ;)

Verfasst: Mittwoch 10. Juni 2009, 08:27
von mkesper
Und sollte sie öfter aufgerufen werden (Schleife etc.), dann sollte man die Regular Expression kompilieren.

Verfasst: Mittwoch 10. Juni 2009, 09:53
von EyDu
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

Verfasst: Mittwoch 10. Juni 2009, 16:03
von nemomuk
lol, man kann's sicher "noch" verständlicher und einfacher machen...^^

Verfasst: Mittwoch 10. Juni 2009, 17:43
von snafu
EyDu hat geschrieben:Oder so :roll: :
PEP 8, PEP 8! :evil:

Verfasst: Mittwoch 10. Juni 2009, 17:49
von Dill
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 :!:

Verfasst: Mittwoch 10. Juni 2009, 17:56
von cofi
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

Verfasst: Mittwoch 10. Juni 2009, 17:58
von Dill
besser? 8)

hungrig ist er jetzt nichtmehr (wenn ich xrange richtig verstanden habe. evtl etwas gemütlich, aber in der ruhe liegt die kraft)

Verfasst: Mittwoch 10. Juni 2009, 18:17
von EyDu
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:

Verfasst: Mittwoch 10. Juni 2009, 18:29
von Dill
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.

Verfasst: Mittwoch 10. Juni 2009, 18:31
von EyDu
Oder, zwei Patchdays: "keine zahl drin". (hatte noch ein Edit, daher hast du es wahrscheinlich nicht bemerkt)

Verfasst: Mittwoch 10. Juni 2009, 18:34
von Dill
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.