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

J'ai besoin de supprimer tous les caractères spéciaux, la ponctuation et les espaces d'une chaîne de sorte que je n'ai que des lettres et des chiffres.

146
demandé sur Josh Caswell 2011-04-30 21:41:23

13 réponses

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 feront l'affaire. Cependant, notez que si cela peut être fait sans utiliser une expression régulière, c'est la meilleure façon de le faire.

247
répondu user225312 2011-04-30 20:07:47

Voici une expression rationnelle pour correspondre à une chaîne de caractères qui ne sont pas des lettres ou des chiffres:

[^A-Za-z0-9]+

Voici la commande Python pour faire une substitution regex:

re.sub('[^A-Za-z0-9]+', '', mystring)
147
répondu Andy White 2014-09-10 08:39:05

Chemin plus court:

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

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

35
répondu bastaPasta 2014-08-07 13:26:24

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

In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
14
répondu Grijesh Chauhan 2016-04-14 09:32:50
#!/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 seront supprimés.

12
répondu pkm 2014-05-25 09:28:49

Après avoir vu cela, j'étais intéressé à développer les réponses fournies en découvrant qui s'exécute le moins de temps possible, alors j'ai vérifié certaines des réponses proposées avec timeit contre 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.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 un produit du résultat le plus bas obtenu à partir d'une moyenne de: repeat(3, 2000000)

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

10
répondu mbeacom 2016-08-06 01:04:37

En supposant que vous voulez utiliser une expression rationnelle et que vous voulez / avez besoin D'Unicode-cognisant 2.code x qui est 2to3-prêt:

>>> 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'
>>>
5
répondu John Machin 2011-04-30 21:07:48

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:

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 également bien sûr filtrer par les catégories de ponctuation.

5
répondu Andreas Jung 2012-05-18 13:28:01

Utiliser traduire:

import string

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

Mise en garde: ne fonctionne que sur les chaînes ascii.

3
répondu jjmurre 2016-03-23 19:37:46
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
2
répondu sneha 2018-06-15 19:00:00
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)

Et vous verrez votre résultat comme

' askhnlaskdjalsdk

1
répondu Dsw Wds 2016-02-25 08:20:57

Différemment que tout le monde a fait en utilisant regex, j'essaierais 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 ne veux que des caractères de ' A à z '(majuscules et minuscules) et des nombres, j'exclurais tout le reste:

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

Cela signifie " remplacer chaque caractère qui n'est pas un nombre, ou un caractère dans la plage 'a à z' ou 'A à Z' par une chaîne vide".

En fait, si vous insérer le caractère spécial ^ à la première place de votre regex, vous obtiendrez la négation.

Astuce supplémentaire: si vous avez également besoin de minuscules le résultat, vous pouvez rendre l'expression rationnelle encore plus rapide et plus facile, tant que vous ne trouverez pas de majuscules maintenant.

import re
s = re.sub(r"[^a-z0-9]","",s.lower())
1
répondu Andrea Romagnoli 2018-09-05 10:02:41
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
répondu Vinay Kumar Kuresi 2018-07-16 11:52:40