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 ??
Réponses
Trop de publicités?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, ...}
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.