2014-05-21 32 views
3

我有一个字符串:如何打印这些字符?

"\\xB9 blah\n blah: \xbf\xaa\xb7\xa2\xb2\xbf\n" 

我想这将打印为:

\\xB9 blah 
    blah: \\xbf\\xaa\\xb7\\xa2\\xb2\\xbf 

我曾尝试:

s = "\\xB9 blah\n blah: \xbf\xaa\xb7\xa2\xb2\xbf\n" 
s = s.replace(r'\x',r'\\x')              
print s 

但这种打印出的第二个滑稽人物后面一句话:我如何得到这个工作?

+0

这些打印的字符是否是'??????这些看起来像扩展ASCII十六进制值。 –

回答

2

\xNN符号的字符串转换为字符的代码NN。为了让你的replace方法做你想要的,你需要提供一个字符串,它可以找到子字符串\x。您可以使用原始字符串,或者只是简单地避开反斜杠:

s = r"\\xB9 blah\n blah: \xbf\xaa\xb7\xa2\xb2\xbf\n" 
s = s.replace(r'\x',r'\\x') 

s = "\\xB9 blah\n blah: \\xbf\\xaa\\xb7\\xa2\\xb2\\xbf\n" 
s = s.replace(r'\x',r'\\x') 

如果要打印litteral字符的转义版本,这有点棘手。假设你只希望扩展的ASCII字符被转义,我会这样做:

def escape_non_ascii(s): 
    out = '' 
    for c in s: 
     if 31 < ord(c) < 127: 
      out += c 
     elif c == '\n': 
      out += r'\n' 
     else: 
      out += r'\x{0:x}'.format(ord(c)) 
    return out 

print escape_non_ascii("\\xB9 blah\n blah: \xbf\xaa\xb7\xa2\xb2\xbf\n") 
+0

这几乎做的伎俩,除非我没有生成新行,因为这将显示\ n而不是给我一个实际的换行符。 – smithy

+0

@smithy如果你想要实际的换行,你可以用'out + ='\ n'' *(删除'r')*来代替'out + = r'\ n''。 –

0

试试这个:

s = r"\\xB9 blah\n blah: \xbf\xaa\xb7\xa2\xb2\xbf\n" 
for part in s.split('\\n'): 
    print part