J'ai une chaîne qui commence par un nombre (de 0 à 9) Je sais que je peux "ou" 10 cas de test en utilisant beginwith () mais il existe probablement une solution plus soignée
donc au lieu d'écrire
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
Existe-t-il un moyen plus intelligent / plus efficace?
string.startswith('1')
.s[0]
ou ,s[:1]
mais la solution de John Machin:if s.startswith(tuple('0123456789'))
. De plus, cette solution génère une erreur lorsqu'il arrive que s est une séquence comme un tuple ou une liste, ce qui donne le même résultat que s'il s'agissait d'une chaîne. - Une autre solution est une regex dont le motif est '\ d (? = \ D)' mais l'utilisation de regex est ici superflue.string
est un module de la bibliothèque standard et ne devrait probablement pas être utilisé comme nom de variable. docs.python.org/2/library/string.htmlRéponses:
La
string
bibliothèque de Python a laisdigit()
méthode:string[0].isdigit()
la source
string
module de Python2 n'a pas de méthodes etisdigit
est une méthode d' objetsstr
etunicode
string[:1].isdigit()
>>> string = '1abc' >>> string[0].isdigit() True
la source
string[0]
?string[:1].isdigit()
, qui quittera heureusement avec une chaîne vide.parfois, vous pouvez utiliser regex
>>> import re >>> re.search('^\s*[0-9]',"0abc") <_sre.SRE_Match object at 0xb7722fa8>
la source
Votre code ne fonctionnera pas; vous avez besoin
or
au lieu de||
.Essayer
'0' <= strg[:1] <= '9'
ou
strg[:1] in '0123456789'
ou, si vous êtes vraiment fou
startswith
,strg.startswith(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'))
la source
strg[:1]
ont deux inconvénients: elles ne lèvent pas d'erreur si s peut être une liste de chaînes, et elles produisent True si la chaîne commence par PLUSIEURS chiffres.startswith
et je l' ai implémenté de cette façon dans mon code. Merci.startswith(tuple(str(i) for i in range(10)))
Ce morceau de code:
for s in ("fukushima", "123 is a number", ""): print s.ljust(20), s[0].isdigit() if s else False
imprime les éléments suivants:
fukushima False 123 is a number True False
la source
s[:1].isdigit()
ous and s[0].isdigit()
s and s[0].isdigit()
est encore moins lisible à mon avis. Personnellement, j'aime la construction ... si ... sinon ... Compte tenu de votre remarque, je voudrais juste l'améliorer comme ça:s[0].isdigit() if s!="" else False
Étonnant qu'après si longtemps, il manque encore la meilleure réponse.
L'inconvénient des autres réponses est l'utilisation
[0]
pour sélectionner le premier caractère, mais comme indiqué, cela casse sur la chaîne vide.L'utilisation de ce qui suit évite ce problème et, à mon avis, donne la syntaxe la plus jolie et la plus lisible des options dont nous disposons. Il n'import / dérange pas non plus avec regex):
>>> string = '1abc' >>> string[:1].isdigit() True >>> string = '' >>> string[:1].isdigit() False
la source
Vous pouvez également utiliser
try...except
:try: int(string[0]) # do your stuff except: pass # or do your stuff
la source
Voici mes "réponses" (en essayant d'être unique ici, je ne recommande pas non plus pour ce cas particulier :-)
En utilisant
ord () etlaa <= b <= c
forme spéciale ://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'
(Ceci
a <= b <= c
, commea < b < c
, est une construction Python spéciale et c'est plutôt sympa: comparez1 < 2 < 3
(true) et1 < 3 < 2
(false) et(1 < 3) < 2
(true). Ce n'est pas ainsi que cela fonctionne dans la plupart des autres langages.)En utilisant une expression régulière :
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
la source
ord()
(2) Perdez le^
dans l'expression régulière.Vous pouvez utiliser des expressions régulières .
Vous pouvez détecter les chiffres en utilisant:
if(re.search([0-9], yourstring[:1])): #do something
Le par [0-9] correspond à n'importe quel chiffre et votre chaîne [: 1] correspond au premier caractère de votre chaîne
la source
Utilisez des expressions régulières , si vous souhaitez étendre d'une manière ou d'une autre les fonctionnalités de la méthode.
la source
Essaye ça:
if string[0] in range(10):
la source
range(10)
produit une liste d'entiers, tandis questring[0]
est une chaîne de longueur 1.if string[0] in map(str,range(10))
fonctionne