L'itération sur les chaînes de caractères est malheureusement assez lente en Python. Les expressions régulières sont plus rapides d'un ordre de grandeur pour ce genre de choses. Il suffit de construire soi-même la classe de caractères. Le site unicode data est très utile pour cela, notamment le module unicodedata.catégorie() fonction. Voir Base de données des caractères Unicode pour la description des catégories.
import unicodedata, re, itertools, sys
all_chars = (chr(i) for i in range(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
# or equivalently and much more efficiently
control_chars = ''.join(map(chr, itertools.chain(range(0x00,0x20), range(0x7f,0xa0))))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
Pour Python2
import unicodedata, re, sys
all_chars = (unichr(i) for i in xrange(sys.maxunicode))
categories = {'Cc'}
control_chars = ''.join(c for c in all_chars if unicodedata.category(c) in categories)
# or equivalently and much more efficiently
control_chars = ''.join(map(unichr, range(0x00,0x20) + range(0x7f,0xa0)))
control_char_re = re.compile('[%s]' % re.escape(control_chars))
def remove_control_chars(s):
return control_char_re.sub('', s)
Pour certains cas d'utilisation, il est nécessaire d'ajouter des catégories supplémentaires (par exemple, toutes celles de la catégorie contrôle peut être préférable, bien que cela puisse ralentir le temps de traitement et augmenter considérablement l'utilisation de la mémoire. Nombre de caractères par catégorie :
-
Cc
(contrôle) : 65
-
Cf
(format) : 161
-
Cs
(substitut) : 2048
-
Co
(usage privé) : 137468
-
Cn
(non attribué) : 836601
Modifier Ajout de suggestions à partir des commentaires.