过滤特殊字符,例如shell输出中的颜色代码

ucd*_*eam 8 python shell

我在python中运行shell命令,将其输出记录到文件中,最后在网页上显示.但是也记录了命令输出的颜色样式字符.有没有办法过滤出颜色样式字符或在网页上正确显示它们?非常感谢!

输出日志:

" 22200K .......\u001b[0m\u001b[91m... .......... ...\u001b[0m\u001b[91m.\u001b[0m\u001b[91m...... .........\u001b[0m\u001b[91m.\u001b[0m\u001b[91m \u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m...... 50% 28.6K 12m55s"
Run Code Online (Sandbox Code Playgroud)

真实的文字:

[INFO][88] 22250K .......... .......... .......... .......... .......... 50% 35.8K 12m53s
Run Code Online (Sandbox Code Playgroud)

jet*_*ico 6

在不太可能的情况下,如果你有xterm256颜色代码,这将过滤'正常'ansi和xterm256 ansi代码:

import re
print re.sub(r'\x1b(\[.*?[@-~]|\].*?(\x07|\x1b\\))', '', a)
Run Code Online (Sandbox Code Playgroud)

或者以稍微不那么混淆和更易读的形式:

'(' + CSI + '.*?' + CMD + '|' + OSC + '.*?' + '(' + ST + '|' + BEL + ')' + ')'
Run Code Online (Sandbox Code Playgroud)

包含测试的完整代码:

import re

tests = [
    u"22200K .......\u001b[0m\u001b[91m... .......... ...\u001b[0m\u001b[91m.\u001b[0m\u001b[91m...... .........\u001b[0m\u001b[91m.\u001b[0m\u001b[91m \u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m...... 50% 28.6K 12m55s",
    u"=\u001b[m=",
    u"-\u001b]23\u0007-",
]

def trim_ansi(a):
    ESC = r'\x1b'
    CSI = ESC + r'\['
    OSC = ESC + r'\]'
    CMD = '[@-~]'
    ST = ESC + r'\\'
    BEL = r'\x07'
    pattern = '(' + CSI + '.*?' + CMD + '|' + OSC + '.*?' + '(' + ST + '|' + BEL + ')' + ')'
    return re.sub(pattern, '', a)

for t in tests:
    print trim_ansi(t)
Run Code Online (Sandbox Code Playgroud)


jet*_*ico 5

这在大多数情况下应该有效:

\n
import re\nprint(re.sub(u\'\\u001b\\[.*?[@-~]\', \'\', a))\n
Run Code Online (Sandbox Code Playgroud)\n

更新

\n
\n

转义序列以字符 ESC 开头(ASCII 十进制 27/十六进制 0x1B/八进制 033)。对于两个字符序列,第二个字符的范围为 ASCII 64\xe2\x80\x9395(@ 到 _)。\n但是,大多数序列都超过两个字符,并且以字符 ESC 和 [ 开头(左括号) )。该序列称为 CSI,即控制序列引入器(或控制序列发起器)。这些序列的最后一个字符的范围为 ASCII 64\xe2\x80\x93126(@ 到 ~)。\n( http://en.wikipedia.org/wiki/ANSI_escape_code )

\n
\n

更新2

\n

使用以下\'a.py\':

\n
import sys, re\n\nfor line in sys.stdin:\n    sys.stdout.write(re.sub(u\'\\u001b\\[.*?[@-~]\', \'\', line))\n
Run Code Online (Sandbox Code Playgroud)\n

这对我来说很顺利:

\n
ls --color | python a.py\n
Run Code Online (Sandbox Code Playgroud)\n