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.
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.
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)
Chemin plus court:
import re
cleanString = re.sub('\W+','', string )
Si vous voulez des espaces entre les mots et les nombres, remplacez "par"
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!!!'
'.join(e for e in string if e.isalnum())
string1
- Résultat: 10.7061979771string2
- Résultat: 7.78372597694import re re.sub('[^A-Za-z0-9]+', '', string)
string1
- Résultat: 7.10785102844string2
- Résultat: 4.12814903259import re re.sub('\W+','', string)
string1
- Résultat: 3.11899876595string2
- Résultat: 2.78014397621Les 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 .
Je pense que filter(str.isalnum, string)
fonctionne
In [20]: filter(str.isalnum, 'string with special chars like !,#$% etcs.')
Out[20]: 'stringwithspecialcharslikeetcs'
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
#!/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.
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())
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'
>>>
s = re.sub(r"[-()\"#/@;:<>{}`+=~|.!?,]", "", s)
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.
Utiliser traduire:
import string
def clean(instr):
return instr.translate(None, string.punctuation + ' ')
Avertissement: ne fonctionne que sur les chaînes ascii.
import re
abc = "askhnl#$%askdjalsdk"
ddd = abc.replace("#$%","")
print (ddd)
et vous verrez votre résultat comme
'askhnlaskdjalsdk
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"))