134 votes

Remplacer tous les caractères non alphanumériques dans une chaîne de caractères.

J'ai une chaîne de caractères avec laquelle je veux remplacer tout caractère qui n'est pas un caractère standard ou un nombre tel que (a-z ou 0-9) par un astérisque. Par exemple, "h^&ell`.,|o w]{+orld" est remplacé par "h*ell*o*w*orld". Notez que les caractères multiples tels que "^&" sont remplacés par un astérisque. Comment dois-je m'y prendre ?

249voto

nneonneo Points 56821

Regex à la rescousse !

import re

s = re.sub('[^0-9a-zA-Z]+', '*', s)

Exemple :

>>> re.sub('[^0-9a-zA-Z]+', '*', 'h^&ell`.,|o w]{+orld')
'h*ell*o*w*orld'

54voto

baloan Points 43

La voie pythonique.

print "".join([ c if c.isalnum() else "*" for c in s ])

Cependant, cela ne permet pas de regrouper plusieurs caractères consécutifs qui ne correspondent pas, par exemple

"h^&i => "h**i no "h*i" comme dans les solutions regex.

17voto

Don Points 5574

Essayez :

s = filter(str.isalnum, s)

dans Python3 :

s = ''.join(filter(str.isalnum, s))

Modifier : J'ai réalisé que le PO veut remplacer les non-chars par '*'. Ma réponse ne convient pas

15voto

psun Points 335

Utilisez \W ce qui est équivalent à [^a-zA-Z0-9_] . Vérifiez la documentation, https://docs.python.org/2/library/re.html

import re
s =  'h^&ell`.,|o w]{+orld'
replaced_string = re.sub(r'\W+', '*', s)
output: 'h*ell*o*w*orld'

mise à jour : Cette solution exclura également les tirets bas. Si vous souhaitez que seuls les alphabets et les chiffres soient exclus, la solution de nneonneo est plus appropriée.

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