HOWTO · Python
Supprimer les caractères spéciaux de la chaîne en Python
Ce tutoriel explique comment supprimer tous les caractères spéciaux de la chaîne en Python
Sur cette page
Pour supprimer des caractères d’une chaîne Python, commencez par décider lesquels conserver. Une compréhension ou filter() avec str.isalnum() conserve les lettres et les chiffres Unicode ; une expression régulière peut préserver les espaces, tandis que str.translate() permet de cibler un ensemble précis de caractères. Les exemples ci-dessous utilisent "Hey! What's up bro?" pour illustrer clairement chaque règle. Chaque exemple de code définit sa propre entrée et affiche la chaîne transformée : vous pouvez donc exécuter les différentes approches indépendamment.
Définir ce qui compte comme un caractère spécial
Il n’existe pas de règle unique pour définir un « caractère spécial ». Il peut s’agir uniquement de la ponctuation, de la ponctuation et des espaces, ou de tout caractère qui n’est ni une lettre ni un chiffre ASCII. Choisissez la règle en fonction de l’usage de la chaîne nettoyée : un nom affiché peut conserver les espaces, contrairement à un identifiant compact.
Les chaînes Python sont en Unicode. str.isalnum() reconnaît les lettres et les chiffres Unicode ; cette méthode peut donc conserver des caractères comme é et 中. À l’inverse, un motif contenant [a-zA-Z0-9] couvre les lettres et les chiffres ASCII. Les méthodes ci-dessous produisent donc des résultats différents si vous ne leur appliquez pas la même règle de sélection des caractères.
Supprimer les caractères non alphanumériques avec une compréhension
Utilisez une compréhension de chaîne avec str.isalnum() si vous voulez que le résultat ne contienne que des lettres et des chiffres. str.join() rassemble les caractères conservés dans une nouvelle chaîne. Cette règle supprime également les espaces et la ponctuation.
original = "Hey! What's up bro?"
cleaned = "".join(char for char in original if char.isalnum())
print(cleaned)
HeyWhatsupbro
Le prédicat conserve les lettres et les chiffres Unicode, ainsi que les caractères ASCII. Par exemple, une lettre comme é est conservée ; les espaces, les apostrophes et la ponctuation sont supprimés.
Filtrer les caractères avec filter()
La fonction intégrée filter() applique un prédicat à chaque caractère et renvoie un itérateur contenant ceux pour lesquels le prédicat est vrai. En lui passant str.isalnum, vous conservez les mêmes lettres et chiffres Unicode qu’avec la compréhension ; str.join() convertit l’itérateur en chaîne. Comme avec la compréhension, les espaces sont supprimés.
original = "Hey! What's up bro?"
kept = filter(str.isalnum, original)
cleaned = "".join(kept)
print(cleaned)
HeyWhatsupbro
Utilisez filter() si vous souhaitez réutiliser un prédicat ou si vous en avez déjà défini un. Pour cette transformation simple d’une chaîne, la compréhension exprime la même règle de façon plus concise.
Supprimer un ensemble défini de caractères avec str.translate()
Utilisez str.translate() lorsque vous connaissez les caractères à supprimer et souhaitez conserver tous les autres. str.maketrans() crée une table qui associe chaque caractère sélectionné à sa suppression. L’ensemble ci-dessous retire les signes de ponctuation ASCII les plus courants ; les espaces et les caractères qui ne figurent pas dans la liste restent inchangés.
original = "Hey! What's up bro?"
characters_to_remove = "!@#$%^&*()_-+=<>,./?;:'\"[]{}\\|`~"
table = str.maketrans("", "", characters_to_remove)
cleaned = original.translate(table)
print(cleaned)
Hey Whats up bro
Ajoutez des caractères à characters_to_remove ou retirez-en pour adapter la règle à votre entrée. Cette méthode ne supprime pas tous les caractères qui pourraient être considérés comme de la ponctuation : tout caractère absent de la liste, y compris la ponctuation non ASCII, reste dans le résultat.
Supprimer des caractères avec une expression régulière
Utilisez re.sub() pour remplacer chaque caractère correspondant à un motif. Ce motif ne conserve que les lettres et les chiffres ASCII ; il supprime donc aussi bien les espaces que la ponctuation. L’illustration associée à l’article montre cette même règle. Les plages de lettres et de chiffres utilisées sont propres à l’ASCII ; si le texte contient des lettres en dehors de ces plages, choisissez une règle compatible avec Unicode.
import re
original = "Hey! What's up bro?"
pattern = r"[^a-zA-Z0-9]"
cleaned = re.sub(pattern, "", original)
print(cleaned)
HeyWhatsupbro
Les éléments d’exécution fournis indiquent que cet exemple produit la sortie affichée ci-dessus. Pour conserver les espaces, ajoutez \s à l’ensemble des caractères autorisés, comme dans r"[^a-zA-Z0-9\s]". Les classes de caractères et les indicateurs des expressions régulières de Python permettent d’exprimer d’autres règles ; vérifiez toutefois que le motif choisi correspond bien à la langue et aux caractères de vos données.
Transformer les caractères avec map() et une lambda
map() applique une fonction à chaque caractère et renvoie un itérateur. Une lambda peut renvoyer le caractère d’origine s’il s’agit d’une lettre ou d’un chiffre Unicode, ou d’un espace blanc, et renvoyer une chaîne vide dans les autres cas. En joignant ces résultats, vous obtenez la chaîne nettoyée ; cette règle conserve les espaces blancs, y compris les tabulations et les sauts de ligne.
original = "Hey! What's up bro?"
cleaned = "".join(
map(lambda char: char if char.isalnum() or char.isspace() else "", original)
)
print(cleaned)
Hey Whats up bro
Cette approche traite les caractères un par un et convient lorsque la transformation exige une logique plus élaborée qu’un simple prédicat d’inclusion. Si votre règle consiste seulement à conserver les lettres et les chiffres, utilisez plutôt l’exemple avec la compréhension ou filter().
Choisir la méthode adaptée à vos règles de sélection
- Choisissez une compréhension avec
str.isalnum()pour appliquer une règle directe et lisible qui conserve les lettres et les chiffres Unicode et supprime les espaces blancs. - Choisissez
filter()si vous souhaitez transmettre un prédicat réutilisable ; dans l’exemple, cette approche suit la même règle avecstr.isalnum(). - Choisissez
str.translate()pour supprimer un ensemble connu de caractères tout en conservant tous les autres, y compris les espaces blancs et la ponctuation non répertoriée. - Choisissez
re.sub()lorsqu’un motif décrit les caractères à supprimer ou à conserver. Les plages ASCII de l’exemple suppriment les espaces blancs ; adaptez le motif au texte Unicode ou pour préserver les espaces blancs. - Choisissez
map()avec une lambda pour appliquer une transformation caractère par caractère. L’exemple conserve les lettres et les chiffres Unicode ainsi que les espaces blancs.
Pour les noms ou les textes en langue naturelle, décidez comment traiter les accents, les écritures non latines et les espaces avant de nettoyer la chaîne. Pour des identifiants ou des données propres à un protocole, respectez précisément le jeu de caractères documenté au lieu de vous fier à une notion générale de « caractères spéciaux ».