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?
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?
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
.
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'
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 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.