web-dev-qa-db-fra.com

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

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

185
user664546

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 regex, d'autres solutions suffiront. Cependant, notez que si cela peut être fait sans utiliser d'expression régulière, c'est la meilleure façon de s'y prendre.

294
user225312

Voici une expression rationnelle 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 permettant de remplacer un regex:

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

Chemin plus court:

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

Si vous voulez des espaces entre les mots et les nombres, remplacez "par"

39
bastaPasta

Après avoir vu cela, je souhaitais développer les réponses fournies en recherchant laquelle s'exécutait dans le minimum de temps. J'ai donc vérifié et vérifié certaines des réponses proposées avec timeit contre deux des exemples. cordes:

  • 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.7061979771
  • string2 - Résultat: 7.78372597694

Exemple 2

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

  • string1 - Résultat: 7.10785102844
  • string2 - Résultat: 4.12814903259

Exemple 3

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

  • string1 - Résultat: 3.11899876595
  • string2 - Résultat: 2.78014397621

Les résultats ci-dessus sont le produit du plus faible résultat renvoyé, sur une moyenne de: repeat(3, 2000000)

Exemple 3 peut être 3 fois plus rapide que Exemple 1 .

25
mbeacom

Python 2. *

Je pense que filter(str.isalnum, string) fonctionne

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'

Python 3. *

En Python3, la fonction filter( ) renverrait un objet itertable (au lieu d'une chaîne contrairement à ce qui est décrit ci-dessus). Il faut rejoindre pour obtenir une chaîne d'itertable:

''.join(filter(str.isalnum, string)) 

ou passer list en utilisation de jointure ( pas sûr mais peut être rapide un pe )

''.join([*filter(str.isalnum, string)])

remarque: décompresser dans [*args] valide à partir de Python> = 3.5

19
Grijesh Chauhan
#!/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 plus de caractère spécial et qui sera remplacé par "" ne signifie rien, c'est-à-dire qu'ils ne seront pas supprimés.

15
pkm

Contrairement aux autres utilisateurs de regex, j’essayerais d’exclure tous les caractères ce n’est pas ce que je veux, au lieu d’énumérer explicitement ce que je ne veux pas.

Par exemple, si je ne veux que des caractères de 'a à z' (majuscules et minuscules) et des nombres, j'exclue tout le reste:

import re
s = re.sub(r"[^a-zA-Z0-9]","",s)

Cela signifie "remplacez chaque caractère qui n'est pas un nombre ou un caractère compris entre" a à z "ou" de 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 avez également besoin de minuscule le résultat, vous pouvez rendre la regex encore plus rapide et plus facile, tant que vous ne trouvez pas de majuscule maintenant.

import re
s = re.sub(r"[^a-z0-9]","",s.lower())
11
Andrea

En supposant que vous souhaitiez utiliser une regex et que vous souhaitiez/ayez besoin d'un code 2.x Unicode-cognizant compatible 2to3:

>>> import re
>>> rx = re.compile(u'[\W_]+', re.UNICODE)
>>> data = u''.join(unichr(i) for i in range(256))
>>> rx.sub(u'', data)
u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\xaa\xb2 [snip] \xfe\xff'
>>>
7
John Machin
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
5
sneha

L'approche la plus générique consiste à utiliser les "catégories" de la table unicodedata, qui classe chaque caractère. Par exemple. le code suivant ne filtre que 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 liées. Vous pouvez aussi bien sûr filtrer par catégories de ponctuation.

5
Andreas Jung

Utiliser traduire:

import string

def clean(instr):
    return instr.translate(None, string.punctuation + ' ')

Avertissement: ne fonctionne que sur les chaînes ascii.

3
jjmurre
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)

et vous verrez votre résultat comme

'askhnlaskdjalsdk

1
Dsw Wds
import re
my_string = """Strings are amongst the most popular data types in Python. We can create the strings by enclosing characters in quotes. Python treats single quotes the 

identique aux guillemets doubles. "" "

# if we need to count the Word python that ends with or without ',' or '.' at end

count = 0
for i in text:
    if i.endswith("."):
        text[count] = re.sub("^([a-z]+)(.)?$", r"\1", i)
    count += 1
print("The count of Python : ", text.count("python"))
0
Vinay Kumar Kuresi