11
votes

Remplacer les caractères non numériques

Je dois remplacer des caractères non numériques d'une chaîne.

Par exemple, "8-4545-225-144" doit être "84545225144"; "$ 334fdf890 == -" doit être "334890".

Comment puis-je faire cela?


0 commentaires

6 Réponses :


20
votes
''.join(c for c in S if c.isdigit())

3 commentaires

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.



17
votes

Il est possible avec regex.

import re

...

return re.sub(r'\D', '', theString)


0 commentaires

0
votes

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


2 commentaires

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.



0
votes

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) 


0 commentaires

1
votes

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


0 commentaires

3
votes

filtre (str.isdigit, s) est plus rapide et plus clair que tout ce qui est listé ici.

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 alternatif (type (s) .isdigit, s) , légèrement plus lent mais toujours plus rapide que le re et la compréhension versions pour moi.

EDIT: Bien que si vous êtes une médieur pauvre bloquée avec Python 3, vous devrez utiliser "". Joindre (filtre (str.isdigit, s)) Ce qui vous met fermement dans le domaine de la performance de manière équivalente. De tels progrès.


0 commentaires