我在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)
在不太可能的情况下,如果你有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)
这在大多数情况下应该有效:
\nimport re\nprint(re.sub(u\'\\u001b\\[.*?[@-~]\', \'\', a))\nRun Code Online (Sandbox Code Playgroud)\n更新
\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
更新2
\n使用以下\'a.py\':
\nimport sys, re\n\nfor line in sys.stdin:\n sys.stdout.write(re.sub(u\'\\u001b\\[.*?[@-~]\', \'\', line))\nRun Code Online (Sandbox Code Playgroud)\n这对我来说很顺利:
\nls --color | python a.py\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
1929 次 |
| 最近记录: |