103 votes

Comment puis-je supprimer les séquences d'échappement ANSI d'une chaîne de caractères en python ?

Voici un extrait qui inclut ma chaîne de caractères.
'ls\r\n\x1b[00m\x1b[01;31mexamplefile.zip\x1b[00m\r\n\x1b[01;31m'

La chaîne a été renvoyée par une commande SSH que j'ai exécutée. Je ne peux pas utiliser la chaîne dans son état actuel car elle contient des séquences d'échappement normalisées ANSI. Comment puis-je supprimer par programme les séquences d'échappement de sorte que la seule partie de la chaîne qui reste soit 'examplefile.zip' .

0voto

Mila Nautikus Points 31

Aucune des solutions regex n'a fonctionné dans mon cas avec Séquences OSC ( \x1b] )

pour rendre réellement la sortie visible, vous aurez besoin d'un émulateur de terminal tel que pyte

#! /usr/bin/env python3

import pyte # terminal emulator: render terminal output to visible characters

pyte_screen = pyte.Screen(80, 24)
pyte_stream = pyte.ByteStream(pyte_screen)

bytes_ = b''.join([
  b'$ cowsay hello\r\n', b'\x1b[?2004l', b'\r', b' _______\r\n',
  b'< hello >\r\n', b' -------\r\n', b'        \\   ^__^\r\n',
  b'         \\  (oo)\\_______\r\n', b'            (__)\\       )\\/\\\r\n',
  b'                ||----w |\r\n', b'                ||     ||\r\n',
  b'\x1b]0;user@laptop1:/tmp\x1b\\', b'\x1b]7;file://laptop1/tmp\x1b\\', b'\x1b[?2004h$ ',
])
pyte_stream.feed(bytes_)

# pyte_screen.display always has 80x24 characters, padded with whitespace
# -> use rstrip to remove trailing whitespace from all lines
text = ("".join([line.rstrip() + "\n" for line in pyte_screen.display])).strip() + "\n"
print("text", text)

print("cursor", pyte_screen.cursor.y, pyte_screen.cursor.x)
print("title", pyte_screen.title)

-3voto

Neodied Points 109

Si vous souhaitez supprimer le \r\n vous pouvez passer la chaîne par cette fonction ( écrit par sarnold ):

def stripEscape(string):
    """ Removes all escape sequences from the input string """
    delete = ""
    i=1
    while (i<0x20):
        delete += chr(i)
        i += 1
    t = string.translate(None, delete)
    return t

Attention toutefois, cela regroupera le texte situé devant et derrière les séquences d'échappement. Ainsi, en utilisant la chaîne filtrée de Martijn 'ls\r\nexamplefile.zip\r\n' vous obtiendrez lsexamplefile.zip . Notez le ls devant le nom de fichier souhaité.

J'utiliserais d'abord la fonction stripEscape pour supprimer les séquences d'échappement, puis je passerais la sortie à l'expression régulière de Martijn, qui éviterait de concaténer le bit indésirable.

-3voto

V.Ignatov Points 25

Pour 2020 avec python 3.5, c'est aussi facile que string.encode().decode('ascii')

ascii_string = 'ls\r\n\x1b[00m\x1b[01;31mexamplefile.zip\x1b[00m\r\n\x1b[01;31m'
decoded_string = ascii_string.encode().decode('ascii')
print(decoded_string) 

>ls
>examplefile.zip
>

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