122 votes

Comment dire si une chaîne de caractères commence par un nombre avec Python ?

J'ai une chaîne qui commence par un numéro (de 0 à 9). Je sais que je peux "ou" 10 cas de test en utilisant startswith() mais il y a probablement une solution plus propre.

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 une méthode plus intelligente ou plus efficace ?

1 votes

Si la question est posée : "Est-ce trop répétitif ?", il y a de fortes chances - dans un langage de haut niveau - que la réponse soit "Oui, c'est sûr". Soyez paresseux !

51 votes

Vous avez manqué string.startswith('1') .

2 votes

@Illusionist Telle qu'elle est écrite, votre question signifie que vous voulez détecter les chaînes qui commencent par UN seul chiffre. Si c'est le cas, la seule bonne réponse parmi celles qui suivent, n'est pas celle qui utilise s[0] o s[:1] mais la solution de John Machin : if s.startswith(tuple('0123456789')) . De plus, cette solution soulève une erreur lorsqu'il arrive que s est une séquence comme un tuple ou une liste, dont les cas produisent le même résultat que si c'était une chaîne de caractères. - Une autre solution est une regex dont le motif est ' \d (?= \D )' mais l'utilisation de regex est superflue ici.

222voto

plaes Points 8535

Python string la bibliothèque a isdigit() méthode :

string[0].isdigit()

7 votes

Python2 string module n'a pas de méthodes, et isdigit est une méthode de str y unicode objets.

3 votes

@plaes : -1 à cause de ce qui précède PLUS il se plante si s == ""

7 votes

Regardez ma réponse qui ne se casse pas pour une chaîne vide : string[:1].isdigit()

31voto

jcomeau_ictx Points 15736
>>> string = '1abc'
>>> string[0].isdigit()
True

1 votes

Je ne suis pas un spécialiste de Python, alors vous pouvez peut-être m'aider : cette fonction va-t-elle exploser sur "", où il n'y a pas d'adresse IP. string[0] ?

0 votes

Oui, c'est sûr. Vous pouvez utiliser (string ou 'x')[0].isdigit() pour le corriger pour '' ou None.

34 votes

Vous pouvez essayer string[:1].isdigit() qui se contentera de traiter une chaîne vide.

19voto

PascalvKooten Points 3697

Il est surprenant qu'après une si longue période, la meilleure réponse manque toujours.

L'inconvénient des autres réponses est d'utiliser [0] pour sélectionner le premier caractère, mais comme nous l'avons noté, cela ne fonctionne pas avec une chaîne vide.

L'utilisation de ce qui suit contourne ce problème, et, à mon avis, donne la syntaxe la plus jolie et la plus lisible des options dont nous disposons. Elle n'importe pas non plus les regex et ne les dérange pas) :

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

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

11voto

kurumi Points 10096

Parfois, vous pouvez utiliser une expression rationnelle

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

0 votes

Surenchère ! Pourquoi utiliser re quand on peut le faire dans les bultins.

1 votes

@JakobBowyer Au moins, c'est bon de le savoir ! Même si dans ce cas, oui, les regex sont inutiles si certains modules intégrés peuvent faire la même chose.

9voto

John Machin Points 39706

Votre code ne fonctionnera pas ; vous devez or au lieu de || .

Essayez

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

ou

strg[:1] in '0123456789'

ou, si vous êtes vraiment fou de startswith ,

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

0 votes

Je t'aurais upvoted si il n'y avait que la solution avec startswith(un tuple) . Mais les solutions avec strg[:1] ont deux inconvénients : ils ne lèvent pas une erreur si s peuvent être une liste de chaînes de caractères, et ils produisent Véritable si la chaîne commence par PLUSIEURS chiffres.

0 votes

@eyquem ils produisent Vrai si la chaîne commence par PLUSIEURS chiffres Alors ? Les autres réponses ne vérifient pas cela, car il n'était pas obligatoire de vérifier que les autres caractères n'étaient pas numériques.

0 votes

I Je suis fou pour startswith et je l'ai implémenté de cette façon dans mon code. Je vous remercie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X