0
print proc1
"\u001b[H\u001b[2J\r\nPRINT ME"

如何只打印“打印我”。我不想打印其他块。

以上是 Python 调用时 shell 脚本的fabric输出run。我将fabric消息返回给我Flask的身份

return json.dumps(proc1)

更新

来自的回应flask如下:

"Output": "\"\\u001b[H\\u001b[2J\\r\\nPROCESS1       : process not running\\r\\n \\r\\nPROCESS2       : process running\\r\\nT\""}

我正在考虑删除\u001b[H2J和其他垃圾

4

2 回答 2

2

我能想到的最简单的方法是使用str.split及其maxsplit参数:

In [1]: output = "\"\\u001b[H\\u001b[2J\\r\\nPROCESS1       : process not running\\r\\n \\r\\nPROCESS2       : process running\\r\\nT\""

In [2]: output.split('\\r\\n', maxsplit=1)[-1]
Out[2]: 'PROCESS1       : process not running\\r\\n \\r\\nPROCESS2       : process running\\r\\nT"'

如果您使用的是旧版本的 python(我相信 python2 和 python3.x,x <= 2),您可能需要将 指定maxsplit为位置参数:

In [3]: output.split('\\r\\n', 1)[-1]
Out[3]: 'PROCESS1       : process not running\\r\\n \\r\\nPROCESS2       : process running\\r\\nT"'

输出开头的垃圾似乎是一个清除终端的转义序列(至少,这样做:

print "\u001b[H\u001b[2J\r\nPRINT ME".decode('unicode-escape')

在 Konsole 中具有此效果。

假设格式始终是十六进制数字形式的 unicode 转义"UTUT\r\n,并且是由加号和字母组成的终端转义,以下应该能够去掉第一个字符:U\uxxxxxT[

In [9]: regex = re.compile(r'"\\u(\d|[a-f])+\[(\w|\d)+\\u(\d|[a-f])+\[(\d|\w)+\\r\\n')

In [10]: regex.sub('', output)
Out[10]: 'PROCESS1       : process not running\\r\\n \\r\\nPROCESS2       : process running\\r\\nT"'

如果你不想要最后一个",你可以简单地做:

regex.sub('', output)[:-1]

这将简单地修剪字符串的开头并删除最后一个字符。如果由于某种原因 the"可能不是您可以使用的最后一个字符:

In [2]: regex = re.compile(r'"\\u(\d|[a-f])+\[(\w|\d)+\\u(\d|[a-f])+\[(\d|\w)+\\r\\n(?P<content>[^"]+)')

In [3]: output = "\"\\u001b[H\\u001b[2J\\r\\nPROCESS1       : process not running\\r\\n \\r\\nPROCESS2       : process running\\r\\nT\""

In [4]: regex.match(output).group('content')
Out[4]: 'PROCESS1       : process not running\\r\\n \\r\\nPROCESS2       : process running\\r\\nT'

我假设您需要的字符串包含".

于 2013-09-19T13:02:20.287 回答
-1

Python 将字符串 proc1 表示为字节字符串。确保它表示为 unicode 字符串,在字符串前面加上 u。

所以,

proc1 = u"\u001b[H\u001b[2J\r\nPRINT ME"
于 2013-09-19T08:31:13.393 回答