Je dois supprimer tous les caractères spéciaux, la ponctuation et les espaces d'une chaîne afin de n'avoir que des lettres et des chiffres.
236
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 sur l'utilisation de regex, d'autres solutions feront l'affaire. Notez cependant que si cela peut être fait sans utiliser une expression régulière, c'est la meilleure façon de procéder.
isalnum()
versions regex et regex, et celle regex est 50-75% plus rapideVoici une expression régulière pour faire correspondre une chaîne de caractères qui ne sont pas des lettres ou des chiffres:
Voici la commande Python pour effectuer une substitution regex:
la source
+
quantificateur pour améliorer un peu son efficacité.)[^A-Za-z0-9 ]+
Manière plus courte:
Si vous voulez des espaces entre les mots et les nombres, remplacez '' par ''
la source
r'\W+'
- légèrement hors sujet (et très pédant) mais je suggère une habitude que tous les motifs d'expression régulière soient des chaînes brutesAprès avoir vu cela, j'étais intéressé à développer les réponses fournies en découvrant ce qui s'exécute dans le moins de temps, donc j'ai parcouru et vérifié certaines des réponses proposées avec
timeit
deux des chaînes d'exemple:string1 = 'Special $#! characters spaces 888323'
string2 = 'how much for the maple syrup? $20.99? That s ricidulous!!!'
Exemple 1
'.join(e for e in string if e.isalnum())
string1
- Résultat: 10.7061979771string2
- Résultat: 7.78372597694Exemple 2
import re re.sub('[^A-Za-z0-9]+', '', string)
string1
- Résultat: 7.10785102844string2
- Résultat: 4.12814903259Exemple 3
import re re.sub('\W+','', string)
string1
- Résultat: 3.11899876595string2
- Résultat: 2.78014397621Les résultats ci-dessus sont le produit du résultat retourné le plus bas d'une moyenne de:
repeat(3, 2000000)
L'exemple 3 peut être 3 fois plus rapide que l' exemple 1 .
la source
''.join([*filter(str.isalnum, string)])
Python 2. *
Je pense que ça
filter(str.isalnum, string)
marchePython 3. *
En Python3, la
filter( )
fonction retournerait un objet itérable (au lieu d'une chaîne contrairement à ce qui précède). Il faut se joindre à nouveau pour obtenir une chaîne d'itertable:ou pour passer
list
en jointure ( pas sûr mais peut être un peu rapide )note: décompresser en
[*args]
valide depuis Python> = 3.5la source
map
,filter
etreduce
retourne un objet au lieu itertable. Toujours en Python3 +, je préférerai''.join(filter(str.isalnum, string))
(ou passer la liste en utilisation conjointe''.join([*filter(str.isalnum, string)])
) à la réponse acceptée.''.join(filter(str.isalnum, string))
soit une améliorationfilter(str.isalnum, string)
, du moins à lire. Est-ce vraiment la façon Pythreenic (ouais, vous pouvez l'utiliser) de le faire?filter(str.isalnum, string)
ne pas renvoyer de chaîne en Python3 carfilter( )
en Python-3 renvoie l'itérateur plutôt que le type d'argument contrairement à Python-2. +vous pouvez ajouter plus de caractère spécial et qui sera remplacé par '' signifie rien, c'est-à-dire qu'ils seront supprimés.
la source
Contrairement à tout le monde en utilisant regex, j'essayerais d'exclure chaque caractère qui n'est pas ce que je veux, au lieu d'énumérer explicitement ce que je ne veux pas.
Par exemple, si je veux uniquement des caractères de 'a à z' (majuscules et minuscules) et des chiffres, j'exclure tout le reste:
Cela signifie "remplacer chaque caractère qui n'est pas un nombre ou un caractère de la plage" a à z "ou" A à Z "par une chaîne vide".
En fait, si vous insérez le caractère spécial
^
à la première place de votre expression régulière, vous obtiendrez la négation.Astuce supplémentaire: si vous devez également minuscule le résultat, vous pouvez rendre l'expression régulière encore plus rapide et plus facile, tant que vous ne trouverez pas de majuscules maintenant.
la source
En supposant que vous souhaitez utiliser une expression régulière et que vous souhaitez / ayez besoin d'un code 2.x compatible Unicode prêt pour le 2to3:
la source
la source
L'approche la plus générique utilise les «catégories» de la table unicodedata qui classe chaque caractère. Par exemple, le code suivant filtre uniquement les caractères imprimables en fonction de leur catégorie:
Regardez l'URL ci-dessus pour toutes les catégories connexes. Vous pouvez également bien sûr filtrer par catégories de ponctuation.
la source
$
à la fin de chaque ligne?string.punctuation contient les caractères suivants:
Vous pouvez utiliser les fonctions translate et maketrans pour mapper les ponctuations aux valeurs vides (remplacer)
Production:
la source
Utiliser traduire:
Avertissement: ne fonctionne que sur les chaînes ascii.
la source
TypeError: translate() takes exactly one argument (2 given)
avec py3.4Identique aux guillemets doubles. "" "
la source
et vous verrez votre résultat comme
«askhnlaskdjalsdk
la source
re
mais ne l' avez jamais utilisé. Vosreplace
critères ne fonctionnent que pour cette chaîne spécifique. Et si votre chaîne l'estabc = "askhnl#$%!askdjalsdk"
? Je ne pense pas que cela fonctionnera sur autre chose que le#$%
motif. JeSuppression des ponctuations, des nombres et des caractères spéciaux
Exemple :-
Code
Résultat:-
Merci :)
la source
Pour les autres langues comme l' allemand, l' espagnol, danois, français , etc qui contiennent des caractères spéciaux (comme « Umlaute » allemand
ü
,ä
,ö
) il suffit d' ajouter ceux - ci à la chaîne de recherche regex:Exemple pour l'allemand:
la source