Les chaînes en Python sont immuables (ne peuvent pas être modifiées). Pour cette raison, l'effet de line.replace(...)
est simplement de créer une nouvelle chaîne, plutôt que de changer l'ancienne. Vous devez la relier (l'assigner) line
pour que cette variable prenne la nouvelle valeur, avec ces caractères supprimés.
De plus, la façon dont vous le faites va être relativement lente. Cela risque également d'être un peu déroutant pour les pythonateurs expérimentés, qui verront une structure doublement imbriquée et penseront un instant que quelque chose de plus compliqué se passe.
À partir de Python 2.6 et des versions plus récentes de Python 2.x *, vous pouvez utiliser à la place str.translate
, (mais lisez la suite pour les différences Python 3):
line = line.translate(None, '!@#$')
ou remplacement d'expression régulière par re.sub
import re
line = re.sub('[!@#$]', '', line)
Les caractères entre crochets constituent une classe de caractères . Tous les caractères dans line
lesquels se trouvent dans cette classe sont remplacés par le deuxième paramètre pour sub
: une chaîne vide.
En Python 3, les chaînes sont Unicode. Vous devrez traduire un peu différemment. kevpie le mentionne dans un commentaire sur l'une des réponses, et c'est noté dans la documentation destr.translate
.
Lors de l'appel de la translate
méthode d'une chaîne Unicode, vous ne pouvez pas passer le deuxième paramètre que nous avons utilisé ci-dessus. Vous ne pouvez pas non plus passer None
comme premier paramètre. Au lieu de cela, vous passez une table de traduction (généralement un dictionnaire) comme seul paramètre. Ce tableau mappe les valeurs ordinales des caractères (c'est-à-dire le résultat de leur appel ord
) aux valeurs ordinales des caractères qui devraient les remplacer, ou - utilement pour nous - None
pour indiquer qu'ils doivent être supprimés.
Donc, pour faire la danse ci-dessus avec une chaîne Unicode, vous appelleriez 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 générer succinctement un dictionnaire contenant
{ord('!'): None, ord('@'): None, ...}
Encore plus simple, comme le dit une autre réponse , créez la table de traduction en place:
unicode_line = unicode_line.translate({ord(c): None for c in '!@#$'})
Ou créez la même table de traduction avec str.maketrans
:
unicode_line = unicode_line.translate(str.maketrans('', '', '!@#$'))
* pour la compatibilité avec les Pythons antérieurs, vous pouvez créer une table de traduction "null" à 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 contenant les caractères avec des valeurs ordinales de 0 à 255.
filter
fonction et une expression Lambda:filter(lambda ch: ch not in " ?.!/;:", line)
. Assez concis et efficace aussi, je pense. Bien sûr, il renvoie une nouvelle chaîne à laquelle vous devrez attribuer un nom.