720 votes

Supprimer des caractères spécifiques d’une chaîne en python

Je suis en train de supprimer des caractères spécifiques d’une chaîne à l’aide de python. C’est le code que j’utilise en ce moment. Malheureusement, il semble ne rien faire pour la chaîne ??

778voto

intuited Points 7763

Chaînes de caractères en python sont immuables (ne peut pas être changé). De ce fait, l'effet de l' line.replace(...) est tout simplement de créer une nouvelle chaîne, plutôt que de changer l'ancien. Vous devez relier (attribuer) pour line afin d'avoir des variables de prendre la nouvelle valeur, avec ces personnages supprimés.

Aussi, la façon dont vous le faites est va être lente, relativement. Il est également susceptible d'être un peu déroutante pour les expérimentés pythonators, qui vont voir un doublement de la structure imbriquée et de penser un instant que quelque chose de plus compliqué, c'est d'aller sur.

Vous pouvez à la place utiliser str.translate:

line = line.translate(None, '!@#$')

- qui ne fonctionne que sur la version 2.6 de Python et la plus récente de Python 2.versions x * -

ou de l'expression régulière de remplacement avec re.sub

import re
line = re.sub('[!@#$]', '', line)

Les caractères entre crochets constituent une classe de caractères. Tous les caractères line qui sont dans cette catégorie sont remplacés par le deuxième paramètre sub: une chaîne vide.


* pour la compatibilité avec les anciennes Pythons, vous pouvez créer un "null" dans la table de conversion pour passer à la place de None:

import string
line = line.translate(string.maketrans('', ''), '!@#$')

Ici, string.maketrans est utilisé pour créer une table de traduction, qui est juste une chaîne de caractères contenant les caractères avec des valeurs ordinales de 0 à 255.

Je n'ai pas commencé à l'aide de Python 3, de sorte que je ne suis pas sûr de savoir comment vous les traduire en/de Python 3.


Comme kevpie mentionne dans un commentaire sur l'une des réponses, et comme indiqué dans la documentation pour l' str.translate, les choses sont différentes avec des chaînes Unicode.

Lors de l'appel de l' translate méthode de d'une chaîne unicode, vous ne pouvez pas passer le second paramètre que nous avons utilisé ci-dessus. Vous aussi vous ne pouvez pas passer None comme premier paramètre, ou même une table de traduction d' string.maketrans. Au lieu de cela, vous passez un dictionnaire comme le seul paramètre. Ce dictionnaire cartes les valeurs ordinales de caractères (c'est à dire le résultat de l'appel d' ord ) pour les valeurs ordinales des personnages qui doivent les remplacer, ou -utilement à nous- None à indiquer qu'ils devraient être supprimés.

Alors que la danse avec une chaîne Unicode que vous appelez quelque chose comme

translation_table = dict.fromkeys(map(ord, '!@#$'), None)
unicode_line = unicode_line.translate(translation_table)

Ici, dict.fromkeys et map sont utilisés pour succinctement générer un dictionnaire contenant

{ord('!'): None, ord('@'): None, ...}

344voto

gsbabil Points 2122

Je suis absent le point ici, ou c’est juste ce qui suit :

Mettez-le dans une boucle :

68voto

ghostdog74 Points 86060
>>> line = "abc#@!?efg12;:?"
>>> ''.join( c for c in line if  c not in '?:!/;' )
'abc#@efg12'

25voto

cod3monk3y Points 1109

Pour l'inverse de la condition de la seule permettant à certains caractères dans une chaîne, vous pouvez utiliser des expressions régulières avec un ensemble de compléter l'opérateur [^ABCabc]. Par exemple, pour supprimer tout sauf ascii des lettres, des chiffres et le trait d'union:

>>> import string
>>> import re
>>>
>>> phrase = '  There were "nine" (9) chick-peas in my pocket!!!      '
>>> allow = string.letters + string.digits + '-'
>>> re.sub('[^%s]' % allow, '', phrase)

'Therewerenine9chick-peasinmypocket'

De le python ordinaire de l'expression de la documentation:

Les caractères qui ne sont pas dans une plage peut être mis en correspondance en complétant le set. Si le premier caractère de l'ensemble est '^', tous les personnages qui ne sont pas dans le jeu sera mis en correspondance. Par exemple, [^5] correspondra n'importe quel caractère sauf '5', et [^^] correspond à tout caractère sauf '^'. ^ n'a pas de signification particulière, si ce n'est pas le premier caractère de la ensemble.

15voto

Muhammad Alkarouri Points 8463
line = line.translate(None, " ?.!/;:")

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