Überprüfen ob die ersten vier Zeichen in einem String Zahlen

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.
Albert
User
Beiträge: 23
Registriert: Montag 29. Oktober 2007, 09:42

Überprüfen ob die ersten vier Zeichen in einem String Zahlen

Beitragvon Albert » Dienstag 20. Mai 2008, 08:43

Hallo,

ich habe eine liste mit Strings ["1234", "Servus", "5678", "Guten Tag" "5348"]. Nun würde ich gerne überprüfen, ob die ersten vier Zeichen in einem String Zahlen sind.

Code: Alles auswählen

wliste = ["1234", "Servus", "5678", "Guten Tag" "5348"]
for entry in wliste:
   if entry ??? == True:
           print entry

Kann mir einer sagen wie das geht?

Vielen Dank schon mal im Voraus.

Grüße
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Beitragvon Trundle » Dienstag 20. Mai 2008, 08:45

Strings können Slicing und haben eine ``isdigit``-Methode.
Albert
User
Beiträge: 23
Registriert: Montag 29. Oktober 2007, 09:42

Beitragvon Albert » Dienstag 20. Mai 2008, 09:18

Super, hat geklappt!

Code: Alles auswählen

if entry.isdigit() == True:
      print entry


Vielen Dank für deine Hilfe!

Grüße Albert
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Beitragvon Masaru » Dienstag 20. Mai 2008, 10:28

Falls der String gänzlich eine Zahl darstellt, und man die sowieso im Anschluss aus Integer benötigt, kann man auch wie folgt vorgehen:

Code: Alles auswählen

...
try:
    entry = int(entry)
    print "%s ist eine Zahl" % entry
except ValueError:
    print "%s war wohl doch keine Zahl" % entry
...

>>Masaru<<
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Dienstag 20. Mai 2008, 13:11

Wenn es aber doch auch Mischstrings gibt, wobei aber feststeht das - wenn - dann exakt die ersten vier Zeichen Ziffern sind, dann geht es mit Slicing sicherer:

Code: Alles auswählen

wliste = ["1234", "Servus", "5678", "Guten Tag" "5348"]
print '\n'.join( [entry for entry in wliste if entry[:4].isdigit()] )


bzw in der "langen" Variante:

Code: Alles auswählen

wliste = ["1234", "Servus", "5678", "Guten Tag" "5348"]
for entry in wliste:
    if entry[:4].isdigit:
           print entry
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 20. Mai 2008, 13:41

Alternativ gäbe es auch noch sowas:

Code: Alles auswählen

In [1]: import re
In [2]: if re.match('^\d{4}', '3214deinstring'): print 'Ist OK'
   ...:
Ist OK
In [3]: if re.match('^\d{4}', '321keinstring'): print 'Ist OK'
   ...:
In [4]:
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Beitragvon lunar » Dienstag 20. Mai 2008, 14:09

Das dürfte aber um einiges langsamer sein als Slicing und isdigit ;)
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Beitragvon nkoehring » Dienstag 20. Mai 2008, 16:33

lunar hat geschrieben:Das dürfte aber um einiges langsamer sein als Slicing und isdigit ;)


Ja, RegEX ist im allgemeinen langsamer und wohl nur fuer komplexere Dinge wirklich sinnvoll. Aber das weiß Leonidas mit Sicherheit selbst und hat das Beispiel dementsprechend nur der Vollstaendigkeit halber hier angebracht.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 20. Mai 2008, 16:54

lunar hat geschrieben:Das dürfte aber um einiges langsamer sein als Slicing und isdigit ;)

Uh, und ich dacht schon Zustandsautomaten haben Bytevergleich überholt :roll:

Nein, im Ernst - Klar, aber ich muss zugeben, dass sich das Problem recht elegant mit regulären Ausdrücken lösen lässt. Ich hatte übrigens den Satz mit dem Hammer und den regulären Ausdrücken im Kopf, wenn du es genau wissen willst. :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Beitragvon lunar » Dienstag 20. Mai 2008, 17:00

Hey, sorry, ich wollte niemanden beleidigen ;)

@Leonidas, nkoehring
Mir ist schon klar, dass ihr das wisst. Ich nehme das Posting auch unverzüglich zurück, wenn ihr mir garantieren könnt, dass der *OP* das auch weiß ;)
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 20. Mai 2008, 17:03

lunar hat geschrieben:Hey, sorry, ich wollte niemanden beleidigen ;)

Nö keine Sorge. Machen wir eben beim nächten Usertreffen zur not ein Schlammcatchen :D

lunar hat geschrieben:Ich nehme das Posting auch unverzüglich zurück, wenn ihr mir garantieren könnt, dass der *OP* das auch weiß ;)

Ja, ich hätt' erwähnen sollen, dass es langsamer ist.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: Sirius3