value = 'ad.41.bd'
if len(value) == len(value.strip({0,1,2,3,4,5,6,7,8,9})):
# no numbers
else:
# numbers present
Il y a une manière plus propre de la détection des chiffres dans une chaîne de caractères en Python?
OriginalL'auteur James | 2011-07-11
Quoi à ce sujet?
OriginalL'auteur Marcin
EDIT:
carte a pris 1 seconde (sur les vieux python)
imap a été immédiate car imap retourne un générateur. note souvent dans le monde réel, il ya une probabilité plus élevée de la le nombre à la fin du nom de fichier.
J'aime
any
, maismap
génère l'ensemble de la liste de la première. Sivalue
est immense, et le premier caractère est un chiffre, ce code traite la totalité de la chose.Je crois que tout s'arrête lorsqu'il trouve la première Vraie. Cependant, la carte n'est pas le retour d'un générateur (à part que je pense que dans python 3) donc toute une liste est créée dans la mémoire (même si le premier caractère est un chiffre). Sinon, je devine que ce serait assez similaire.
le roi, w/o parens vous créez une liste de méthode. Ce sera toujours évaluer à
True
! Essayez avecvalue = 'abc'
.any(c.isdigit() for c in value)
utilise un générateur d'expression et à la dispense de la lambda et la carte.OriginalL'auteur robert king
EDIT:
Et juste pour le souci du détail:
tout(c.appel isdigit()):
tout c en chiffres):
re.de recherche (1 ou plusieurs chiffres):
re.recherche (arrêter après un chiffre):
re.match (non-greedy):
re.match(gourmand):
tout(map()):
tout imap (()):
Généralement, le moins complexe regexps courut plus vite.
c.isdigit()
etc in digits
sont à peu près équivalents.re.match
est légèrement plus rapide quere.search
.map()
est le plus lent de la solution, maisimap()
a été le plus rapide (mais à l'intérieur de l'erreur d'arrondi deany(c.isdigit)
etany(c in digits)
.Cela semble raisonnable, car il déplace beaucoup de travail à C. j'ai changé
value
à"abcd" * 1000 + "9"
et une diminution denumber
à 10000.any(imap)
a pris 7.588 s,re.search
(arrêter après le premier match) a pris 0.377 s, etany(c in digits)
a pris 4.283 s. La réécriture de la dernièreany(d in value for d in digits)
a pris seulement .310s (et .073s lorsque le dernier chiffre "1" au lieu de "9"), de plus je suppose, parce que il a poussé la plupart de la charge de travail pour arrêt de base.OriginalL'auteur Kirk Strauser
Vous pouvez utiliser un expression régulière:
^
et serait probablement mieux avecre.search
. Aussi,.*
correspond à zéro ou plusieurs caractères de sorte?
est redondante.J'ai pensé
search
pourrait regarder pour tous locations qui correspondent à ce modèle (j'ai besoin d'un seul), alors quematch
ne correspondent au début (si oui, je pourrais omettre^
ici). Je veux le plus court possible, d'où le.*?
(pas gourmand).Les bons points. Après j'ai un peu dormi et avait un peu de café, je vais re-évaluer. 🙂
search
donner seulement le premier match.OriginalL'auteur Felix Kling
OriginalL'auteur Steven Rumbalski
Si vous voulez savoir quelle est la différence, vous pouvez utiliser ré.sub()
OriginalL'auteur mrbox
Afin de détecter des signes dans les numéros de, utilisez le
?
de l'opérateur.OriginalL'auteur Darshan Chaudhary