237 votes

Comment pouvons-nous supprimer tous les caractères non numériques d'une chaîne en Python?

C'est une question simple, mais je suis un noobie en python. Comment pouvons-nous supprimer tous les caractères non numériques d'une chaîne en Python?

Comment puis je faire ça?

403voto

Ned Batchelder Points 128913
>>> import re
>>> re.sub("[^0-9]", "", "sdkjh987978asd098as0980a98sd")
'987978098098098'

138voto

Mark Rushakoff Points 97350

Pas sûr que ce soit le moyen le plus efficace, mais:

 >>> ''.join(c for c in "abc123def456" if c.isdigit())
'123456'
 

La partie ''.join signifie la combinaison de tous les caractères résultants sans aucun caractère intermédiaire. Ensuite, le reste est une compréhension de liste, où (comme vous pouvez probablement le deviner), nous ne prenons que les parties de la chaîne qui correspondent à la condition isdigit .

26voto

tzot Points 32224

Cela devrait fonctionner pour les chaînes et les objets Unicode:

 # python <3.0
def only_numerics(seq):
    return filter(type(seq).isdigit, seq)

# python ≥3.0
def only_numerics(seq):
    seq_type= type(seq)
    return seq_type().join(filter(seq_type.isdigit, seq))
 

10voto

Tim McNamara Points 6478

Juste pour ajouter une autre option pour le mix, il y a plusieurs constantes utiles au sein de l' string module. Alors que de plus en plus utile dans d'autres cas, ils peuvent être utilisés ici.

>>> from string import digits
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'

Il y a plusieurs constantes dans le module, y compris:

  • ascii_letters (abcdefghijklmnopqrstuvwxyzABCDEFghijklmnopqrstuvwxyz)
  • hexdigits (0123456789abcdefABCDEF)

Si vous êtes en utilisant ces constantes fortement, il peut être intéressant pour le convertir à un frozenset. Qui permet à O(1) recherches, plutôt que de O(n), où n est la longueur de la constante pour les chaînes d'origine.

>>> digits = frozenset(digits)
>>> ''.join(c for c in "abc123def456" if c in digits)
'123456'

5voto

Alex Martelli Points 330805

Approche plus rapide, si vous avez besoin de plus que juste un ou deux de ces opérations de suppression (ou même un seul, mais sur une très longue chaîne!-), est de s'appuyer sur l' translate méthode de chaînes, même si elle n'a besoin de quelques préparation:

>>> import string
>>> allchars = ''.join(chr(i) for i in xrange(256))
>>> identity = string.maketrans('', '')
>>> nondigits = allchars.translate(identity, string.digits)
>>> s = 'abc123def456'
>>> s.translate(identity, nondigits)
'123456'

L' translate méthode est différente, et peut-être un peu plus simple plus simple à utiliser, sur des chaînes Unicode que c'est sur les chaînes d'octets, btw:

>>> unondig = dict.fromkeys(xrange(65536))
>>> for x in string.digits: del unondig[ord(x)]
... 
>>> s = u'abc123def456'
>>> s.translate(unondig)
u'123456'

Vous pouvez utiliser un mappage de classe plutôt que d'une réelle dict, surtout si votre chaîne Unicode peuvent potentiellement contenir des caractères très haute ord valeurs (qui permettrait de faire le dict trop grand;-). Par exemple:

>>> class keeponly(object):
...   def __init__(self, keep): 
...     self.keep = set(ord(c) for c in keep)
...   def __getitem__(self, key):
...     if key in self.keep:
...       return key
...     return None
... 
>>> s.translate(keeponly(string.digits))
u'123456'
>>>

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