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.
Pourquoi ne pas utiliser les expressions rationnelles comme règle de base ?
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.
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.
@ChrisDutrow Les regex sont plus lents que les fonctions intégrées des chaînes de caractères de Python.
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.
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é).
Cela supprime également les espaces entre les mots, "great place" -> "greatplace". Comment l'éviter ?
@Reihan_amn Il suffit d'ajouter un espace à l'expression rationnelle, de sorte qu'elle devienne : [^A-Za-z0-9 ]+
Sauf que _ est dans \w et constitue un caractère spécial dans le contexte de cette question.
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.
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
#!/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.
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.
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.