448 votes

Tout sauf les caractères alphanumériques d’une chaîne de décapage en Python

Quelle est la meilleure façon d’enlever tous les caractères non alphanumériques d’une chaîne, à l’aide de Python ?

Les solutions présentées dans la version PHP de cette question fonctionnent probablement avec quelques ajustements mineurs, mais ne semblent pas très « Pythonique » pour moi.

Pour l’anecdote, je ne veux juste dépouiller des périodes et des virgules (et autres signes de ponctuation), mais aussi des citations, supports, etc..

442voto

Otto Allmendinger Points 11853

Je l’ai chronométré seulement certaines fonctions par curiosité

370voto

Ants Aasma Points 22921

Expressions régulières à la rescousse :

81voto

John Machin Points 39706

L'utilisation de la str.translate() méthode.

En supposant que vous faites cela souvent:

(1) une Fois, de créer une chaîne de caractères contenant tous les caractères que vous souhaitez supprimer:

delchars = ''.join(c for c in map(chr, range(256)) if not c.isalnum())

(2) Chaque fois que vous voulez froisser une chaîne de caractères:

scrunched = s.translate(None, delchars)

Le coût de la mise en probablement se compare favorablement avec le feu.compiler, le coût marginal est inférieur:

C:\junk>\python26\python -mtimeit -s"import string;d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s=string.printable" "s.translate(None,d)"
100000 loops, best of 3: 2.04 usec per loop

C:\junk>\python26\python -mtimeit -s"import re,string;s=string.printable;r=re.compile(r'[\W_]+')" "r.sub('',s)"
100000 loops, best of 3: 7.34 usec per loop

Remarque: l'Aide de la chaîne.imprimable en tant que données de référence donne le modèle '[\W_]+' un avantage injuste; tous les caractères non alphanumériques sont dans un tas ... en type de données il n'y aurait plus d'une substitution à faire:

C:\junk>\python26\python -c "import string; s = string.printable; print len(s),repr(s)"
100 '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'

Voici ce qui se passe si vous donnez re.sous un peu plus de travail à faire:

C:\junk>\python26\python -mtimeit -s"d=''.join(c for c in map(chr,range(256)) if not c.isalnum());s='foo-'*25" "s.translate(None,d)"
1000000 loops, best of 3: 1.97 usec per loop

C:\junk>\python26\python -mtimeit -s"import re;s='foo-'*25;r=re.compile(r'[\W_]+')" "r.sub('',s)"
10000 loops, best of 3: 26.4 usec per loop

62voto

ars Points 35803

Vous pouvez essayer :

16voto

DrAl Points 29528

Qu’en est-il :

Cela fonctionne en utilisant compréhension de liste pour obtenir une liste des personnages de s’ils sont présents dans le combiné et `` cordes. Il rejoint ensuite la liste ensemble dans une chaîne.

Prograide.com

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.

Powered by:

X