Unicode - 只需打印字符串即可

时间:2013-09-19 08:24:03

标签: python python-unicode

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

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

以上是Python fabric提供run调用时shell脚本的输出。 我将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和其他垃圾

2 个答案:

答案 0 :(得分: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中有这种效果。

假设格式始终为"UTUT\r\nU\uxxxx形式的unicode转义,其中x为十六进制数字,T为终端由[加上数字和字母组成的转义符,以下内容应该能够删除第一个字符:

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]

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

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'

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

答案 1 :(得分:-1)

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

所以,

proc1 = u"\u001b[H\u001b[2J\r\nPRINT ME"