Je dois remplacer des caractères non numériques d'une chaîne. P>
Par exemple, "8-4545-225-144" doit être "84545225144"; "$ 334fdf890 == -" doit être "334890". P>
Comment puis-je faire cela? P>
6 Réponses :
''.join(c for c in S if c.isdigit())
Je déteste que les gens slament une compréhension de liste lorsqu'une expression de générateur est la bonne option. Vous, monsieur, gagnez un Internet (et un uppote).
+1 pour la solution non-regex. Je déteste quand les peuples utilisent Regex pour tout, certains objectifs conviennent mieux à la solution non-regex
@killown: Je trouve personnellement l'option Regex plus lisible. Peut-être que c'est parce que j'ai tellement fait de travail avec des regexes, mais en regardant le code de @ kennytm, je peux immédiatement voir ce qu'il fait; Celui-ci me prend une seconde pour comprendre.
Il est possible avec regex.
import re ... return re.sub(r'\D', '', theString)
Bien que un peu plus compliqué à configurer, à l'aide de la méthode de la chaîne Traduire () CODE> pour supprimer les caractères indiqués ci-dessous peut autant que 4-6 fois plus vite que d'utiliser Join () code> ou re.sub () code> en fonction des tests de chronométrage, j'ai effectué - donc si cela fait quelque chose de plusieurs fois, vous pouvez envisager d'utiliser cela à la place. nonnumerics = ''.join(c for c in ''.join(chr(i) for i in range(256)) if not c.isdigit())
astring = '123-$ab #6789'
print astring.translate(None, nonnumerics)
# 1236789
La méthode detranslate str.Translate est préférée sur String.Translate.
@Roger Pate, bon point, vieilles habitudes sont difficiles à casser ... J'ai mis à jour le code dans ma réponse en conséquence. Merci de le pointer et de me permettre d'améliorer le code de l'échantillon.
Je préfère les expressions régulières, alors voici un moyen si vous aimez
import re
myStr = '$334fdf890==-'
digts = re.sub('[^0-9]','',myStr)
TEMPS Durée du Joindre CODE> et les versions RE CODE> RE CODE> VERSIONS: In [16]: def withFilter(s): return filter(str.isdigit, s)
....:
In [19]: %timeit withFilter(s)
100000 loops, best of 3: 2.75 us per loop
Il lancera également un typeError si S est un type Unicode. En fonction de la définition des "chiffres" que vous souhaitez, cela peut être plus ou moins utile que le filtre filtre (str.isdigit, s) code> est plus rapide et plus clair que tout ce qui est listé ici. P>
alternatif (type (s) .isdigit, s) code>, légèrement plus lent mais toujours plus rapide que le re et la compréhension versions pour moi. P>
"". Joindre (filtre (str.isdigit, s)) Code> Ce qui vous met fermement dans le domaine de la performance de manière équivalente. De tels progrès. P>