311 votes

Supprimez tous les caractères spéciaux, la ponctuation et les espaces de la chaîne de caractères.

Je dois supprimer tous les caractères spéciaux, la ponctuation et les espaces d'une chaîne de caractères pour n'avoir que des lettres et des chiffres.

445voto

user225312 Points 22699

Cela peut être fait sans regex :

>>> string = "Special $#! characters   spaces 888323"
>>> ''.join(e for e in string if e.isalnum())
'Specialcharactersspaces888323'

Vous pouvez utiliser str.isalnum :

S.isalnum() -> bool

Return True if all characters in S are alphanumeric
and there is at least one character in S, False otherwise.

Si vous insistez pour utiliser les regex, d'autres solutions feront l'affaire. Notez toutefois que si vous pouvez le faire sans utiliser d'expression régulière, c'est la meilleure façon de procéder.

10 votes

Pourquoi ne pas utiliser les expressions rationnelles comme règle de base ?

0 votes

@ChrisDutrow Les regex sont plus lents que les fonctions intégrées des chaînes de caractères de Python.

0 votes

Cela ne fonctionne que lorsque la chaîne est dans unicode . Sinon, il se plaint comme l'objet 'str' n'a pas d'attribut 'isalnum' 'isnumeric' et ainsi de suite.

314voto

Andy White Points 36586

Voici une regex pour faire correspondre une chaîne de caractères qui ne sont ni des lettres ni des chiffres :

[^A-Za-z0-9]+

Voici la commande Python pour effectuer une substitution regex :

re.sub('[^A-Za-z0-9]+', '', mystring)

16 votes

KISS : Keep It Simple Stupid ! Cette solution est plus courte et beaucoup plus facile à lire que les solutions non regex et peut également être plus rapide. (Cependant, j'ajouterais un + quantificateur pour améliorer un peu son efficacité).

2 votes

Cela supprime également les espaces entre les mots, "great place" -> "greatplace". Comment l'éviter ?

11 votes

@Reihan_amn Il suffit d'ajouter un espace à l'expression rationnelle, de sorte qu'elle devienne : [^A-Za-z0-9 ]+

67voto

tuxerrante Points 1

Plus court :

import re
cleanString = re.sub('\W+','', string )

Si vous voulez des espaces entre les mots et les chiffres, remplacez '' par ''.

4 votes

Sauf que _ est dans \w et constitue un caractère spécial dans le contexte de cette question.

0 votes

Cela dépend du contexte - le trait de soulignement est très utile pour les noms de fichiers et autres identifiants, au point que je ne le traite pas comme un caractère spécial mais plutôt comme un espace aseptisé.J'utilise généralement cette méthode moi-même.

2 votes

r'\W+' - légèrement hors sujet (et très pédant) mais je suggère une habitude selon laquelle tous les modèles regex doivent être chaînes brutes

26voto

mkp Points 642
#!/usr/bin/python
import re

strs = "how much for the maple syrup? $20.99? That's ricidulous!!!"
print strs
nstr = re.sub(r'[?|$|.|!]',r'',strs)
print nstr
nestr = re.sub(r'[^a-zA-Z0-9 ]',r'',nstr)
print nestr

vous pouvez ajouter d'autres caractères spéciaux et ils seront remplacés par '' cela ne veut rien dire, c'est-à-dire qu'ils seront supprimés.

6voto

Andreas Jung Points 1

L'approche la plus générique consiste à utiliser les "catégories" de la table unicodedata qui classifie chaque caractère. Par exemple, le code suivant filtre uniquement les caractères imprimables en fonction de leur catégorie :

import unicodedata
# strip of crap characters (based on the Unicode database
# categorization:
# http://www.sql-und-xml.de/unicode-database/#kategorien

PRINTABLE = set(('Lu', 'Ll', 'Nd', 'Zs'))

def filter_non_printable(s):
    result = []
    ws_last = False
    for c in s:
        c = unicodedata.category(c) in PRINTABLE and c or u'#'
        result.append(c)
    return u''.join(result).replace(u'#', u' ')

Regardez l'URL donnée ci-dessus pour toutes les catégories connexes. Vous pouvez aussi bien sûr filtrer par les catégories de ponctuation.

0 votes

C'est quoi cette $ à la fin de chaque ligne ?

0 votes

S'il s'agit d'un problème de copier-coller, devez-vous le corriger ?

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