Wie kann man feststellen, ob der String mit einer Zahl in Python beginnt?


85

Ich habe eine Zeichenfolge, die mit einer Zahl (von 0 bis 9) beginnt. Ich weiß, dass ich mit startwith () 10 Testfälle "oder" ausführen kann, aber es gibt wahrscheinlich eine bessere Lösung

also anstatt zu schreiben

if (string.startswith('0') || string.startswith('2') ||
    string.startswith('3') || string.startswith('4') ||
    string.startswith('5') || string.startswith('6') ||
    string.startswith('7') || string.startswith('8') ||
    string.startswith('9')):
    #do something

Gibt es einen klügeren / effizienteren Weg?


Wenn die Frage gestellt wird: "Ist das zu repetitiv?", Lautet die Antwort in einer Hochsprache wahrscheinlich "Warum, ja, das ist es sicher". Sei faul!

41
Du hast es verpasst string.startswith('1').
MAK

2
@Illusionist Wie geschrieben, bedeutet Ihre Frage, dass Sie die Zeichenfolgen erkennen möchten, die mit nur einer Ziffer beginnen. Wenn ja, ist die einzige richtige Antwort unter den folgenden, sind nicht diejenigen , mit s[0]oder s[:1]aber die Lösung von John Machin: if s.startswith(tuple('0123456789')). Darüber hinaus löst diese Lösung einen Fehler aus, wenn s eine Sequenz wie ein Tupel oder eine Liste ist. In diesen Fällen wird das gleiche Ergebnis erzielt, als wäre es eine Zeichenfolge. - Eine andere Lösung ist ein Regex, dessen Muster '\ d (? = \ D)' ist, aber die Verwendung von Regex ist hier überflüssig.
Eyquem

3
Nur pedantisch sein: stringist ein Modul in der Standardbibliothek und sollte wahrscheinlich nicht als Variablenname verwendet werden. docs.python.org/2/library/string.html
gak

Antworten:


165

Pythons stringBibliothek hat folgende isdigit()Methode:

string[0].isdigit()

5
Das Python2- string Modul verfügt nicht über Methoden und isdigitist eine Methode von strund unicodeObjekten.
John Machin

3
@plaes: -1 wegen des oben genannten PLUS stürzt es ab, wenn s == ""
John Machin

3
Schauen Sie sich meine Antwort an, die nicht für eine leere Zeichenfolge string[:1].isdigit()
bricht

24
>>> string = '1abc'
>>> string[0].isdigit()
True

Ich bin kein Python-Typ, also können Sie mir vielleicht dabei helfen: Wird diese Funktion auf "" bombardieren, wo es keine gibt string[0]?
CorsiKa

Ja, das wird es sicher. Sie könnten (string oder 'x') [0] .isdigit () verwenden, um es für '' oder None
jcomeau_ictx

29
Sie könnten versuchen string[:1].isdigit(), mit einem leeren String glücklich umzugehen.
Simon Callan

2
weil das nicht meine Antwort ist; meins ist immer noch besser, wenn der Programmierer wünscht, dass eine Ausnahme auf eine leere Zeichenfolge geworfen wird.
jcomeau_ictx

1
@jcomeau_ictx genau richtig. niemals defensiv programmieren. Wenn die Zeichenfolge unerwartet leer ist, sollte dies ein Fehler sein und ohnehin nicht automatisch behandelt werden. Einige Denkschulen sagen, Sie sollten Ausnahmen, die als Warnung nicht kritisch sind, elegant behandeln und abfangen und das Programm am Laufen halten. Ich bin für die meisten Anwendungsfälle nicht dieser Meinung. Die Spezifität der Funktionen und des Codes, die Sie schreiben, hilft dabei, die Randfälle zu verringern, in denen Sie häufiger defensiv codieren müssten.
Jamescampbell

9

Manchmal können Sie Regex verwenden

>>> import re
>>> re.search('^\s*[0-9]',"0abc")
<_sre.SRE_Match object at 0xb7722fa8>

Overkill! Warum re verwenden, wenn Sie es in den Bultins tun können
Jakob Bowyer

1
@ JakobBowyer Zumindest ist es gut, davon zu wissen! Auch wenn in diesem Fall Regexes zu viel des Guten sind, wenn einige eingebaute Geräte dasselbe tun können.
Jeromej

8

Ihr Code funktioniert nicht. du brauchst orstatt ||.

Versuchen

'0' <= strg[:1] <= '9'

oder

strg[:1] in '0123456789'

oder, wenn Sie wirklich verrückt sind startswith,

strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))

Ich hätte dich positiv bewertet, wenn es nur die Lösung mit Startswith (einem Tupel) gegeben hätte . Die Lösungen mit strg[:1]haben jedoch zwei Unannehmlichkeiten: Sie lösen keinen Fehler aus, wenn s eine Liste von Zeichenfolgen ist, und sie erzeugen True, wenn die Zeichenfolge mit mehreren Ziffern beginnt.
Eyquem

@eyquem sie produzieren True, wenn die Zeichenfolge mit mehreren Ziffern beginnt Also? Andere Antworten prüfen dies nicht, da nicht überprüft werden musste, ob andere Zeichen nicht numerisch waren.
Rob Grant

Ich bin verrückt nach startswithund habe es so in meinen Code implementiert. Danke dir.
Jamescampbell

Noch ein Start mit Möglichkeit ...startswith(tuple(str(i) for i in range(10)))
Jérôme

4

Dieser Code:

for s in ("fukushima", "123 is a number", ""):
    print s.ljust(20),  s[0].isdigit() if s else False

druckt folgendes aus:

fukushima            False
123 is a number      True
                     False

4
Das ist hässlich Verwenden Sie s[:1].isdigit()oders and s[0].isdigit()
John Machin

1
@ John Machin Was meinst du mit "hässlich"? Nicht lesbar ? Ich finde Ihre Vorschläge hier oben nicht lesbarer. s and s[0].isdigit()ist meiner Meinung nach noch weniger lesbar. Persönlich mag ich das Konstrukt ... wenn ... sonst ... Unter Berücksichtigung Ihrer Bemerkung würde ich es einfach so verbessern:s[0].isdigit() if s!="" else False
eyquem

3

Überraschend, dass nach so langer Zeit immer noch die beste Antwort fehlt.

Der Nachteil der anderen Antworten ist die [0]Auswahl des ersten Zeichens. Wie bereits erwähnt, wird die leere Zeichenfolge unterbrochen.

Die Verwendung der folgenden Optionen umgeht dieses Problem und bietet meiner Meinung nach die schönste und am besten lesbare Syntax der verfügbaren Optionen. Es importiert / stört sich auch nicht mit Regex):

>>> string = '1abc'
>>> string[:1].isdigit()
True

>>> string = ''
>>> string[:1].isdigit()
False

2

Sie können auch verwenden try...except:

try:
    int(string[0])
    # do your stuff
except:
    pass # or do your stuff

1

Hier sind meine "Antworten" (ich versuche hier einzigartig zu sein, empfehle ich auch für diesen speziellen Fall nicht :-)

Verwenden von ord () unddie spezielle a <= b <= cForm:

//starts_with_digit = ord('0') <= ord(mystring[0]) <= ord('9')
//I was thinking too much in C. Strings are perfectly comparable.
starts_with_digit = '0' <= mystring[0] <= '9'

(Dies a <= b <= cist wie a < b < cein spezielles Python-Konstrukt und es ist ziemlich ordentlich: Vergleiche 1 < 2 < 3(wahr) und 1 < 3 < 2(falsch) und (1 < 3) < 2(wahr). So funktioniert es in den meisten anderen Sprachen nicht.)

Verwenden eines regulären Ausdrucks :

import re
//starts_with_digit = re.match(r"^\d", mystring) is not None
//re.match is already anchored
starts_with_digit = re.match(r"\d", mystring) is not None

1
(1) Verliere das ord()(2) Verliere das ^in der Regex.
John Machin

0

Sie können reguläre Ausdrücke verwenden .

Sie können Ziffern erkennen mit:

if(re.search([0-9], yourstring[:1])):
#do something

Das [0-9] -Par entspricht einer beliebigen Ziffer, und Ihre Zeichenfolge [: 1] entspricht dem ersten Zeichen Ihrer Zeichenfolge



-5

Versuche dies:

if string[0] in range(10):

Das funktioniert überhaupt nicht. range(10)erzeugt eine Liste von ganzen Zahlen, während string[0]eine Zeichenfolge der Länge 1 ist.
Petri Lehtinen

1
Das funktioniert nicht; Die Typen stimmen nicht überein. Aber: if string[0] in map(str,range(10))funktioniert
Phynfo
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.