61 votes

Supprimer les caractères de contrôle d'une chaîne en python

j'ai actuellement le code suivant

 def removeControlCharacters(line):
    i = 0
    for c in line:
        if (c < chr(32)):
            line = line[:i - 1] + line[i+1:]
            i += 1
    return line

Cela ne fonctionne tout simplement pas s'il y a plus d'un caractère à supprimer.

30voto

SilentGhost Points 79627

Vous pouvez utiliser str.translate avec la carte appropriée, par exemple comme ceci :

 >>> mpa = dict.fromkeys(range(32))
>>> 'abc\02de'.translate(mpa)
'abcde'

19voto

irdb Points 11

Toute personne intéressée par une classe de caractères regex qui correspond à n'importe quel caractère de contrôle Unicode peut utiliser [\x00-\x1f\x7f-\x9f] .

Vous pouvez le tester comme ceci :

 >>> import unicodedata, re, sys
>>> all_chars = [chr(i) for i in range(sys.maxunicode)]
>>> control_chars = ''.join(c for c in all_chars if unicodedata.category(c) == 'Cc')
>>> expanded_class = ''.join(c for c in all_chars if re.match(r'[\x00-\x1f\x7f-\x9f]', c))
>>> control_chars == expanded_class
True

Donc, pour supprimer les caractères de contrôle à l'aide de re utilisez simplement ce qui suit :

 >>> re.sub(r'[\x00-\x1f\x7f-\x9f]', '', 'abc\02de')
'abcde'

8voto

Mark Byers Points 318575

Votre implémentation est erronée car la valeur de i est incorrecte. Cependant, ce n'est pas le seul problème : il utilise également à plusieurs reprises des opérations de chaîne lentes, ce qui signifie qu'il s'exécute en O(n 2 ) au lieu de O(n). Essayez plutôt ceci :

 return ''.join(c for c in line if ord(c) >= 32)

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