使用Python转义序列进行字符串格式

时间:2012-08-01 18:51:19

标签: python string escaping hex sequence

为了澄清目的,我正在从头开始重写其他信息。

请考虑以下事项:

y = hex(1200)
y
'0x4b0'

我需要用'\'替换y的前0,使其看起来像'\ x04b0'。我正在通过RS-232序列上的仪器进行通信,该仪器严格采用该格式的参数('\ xSumCharsHere')。 Python不会让我做以下事情。

z = '\x' + y[2:]
ValueError: invalid \x escape

以下是不可接受的,因为它在分配给z的实际值中仍然有'\\'。

z = '\\' + y[1:]
z
'\\x4b0'

最终目标是将这样的命令发送到我的串口:

s.write(z) # s is a serial object
s.write('\x04b0') # This call is an equivalent of the call above
s.write('\\x04b0') # This command will not work

4 个答案:

答案 0 :(得分:2)

您的最后一段代码不符合您的想法:

>>> x = hex(1200)
>>> y = '\\' + x[1: len(x)]
>>> y
'\\x4b0'
>>> print y
\x4b0

当您在Python控制台中键入变量的名称时,Python会将字符串的表示形式打印为Python代码,这就是您看到两个反斜杠的原因 - Python字符串中的字面反斜杠被转义另一个领先的反斜杠。这段代码确实有效,结果的表示只会让你失望。

但是,我建议您使用此代码段,因为您的代码会忽略前导零:

>>> y = '\\x%04x' % 1200
>>> print y
\x04b0

答案 1 :(得分:1)

您的上一个代码位是正确的,也可以使用原始字符串写入:

y = r'\x' + x[2: len(x)]

正如cdhowie在答案中所说:

  

在Python控制台中键入变量名称时,Python会将字符串的表示形式打印为Python代码。这段代码确实有效,结果的表示只会让你失望。

然而,这是手写逃逸序列的替代方案,我认为编码练习稍微好一点,因为它更具可读性。

答案 2 :(得分:0)

后者将起作用。在控制台中,Python使用repr()来打印对象,在这种情况下将显示双斜杠。在控制台中执行print y,您会看到它输出正确。

你也可以稍微清理你的第一个例子:

y = "\\x" + x[2:]

或者第二个:

y = "\\" + x[1:]

答案 3 :(得分:0)

如果您只是尝试将字符串\0x4b0作为控制台上的表示,则需要在控制台上实际调用print

>>> s='\\0{}'.format(hex(1200)[1:])
>>> s
'\\0x4b0'
>>> print s
\0x4b0
>>> s2='\\0'+hex(1200)[1:]
>>> s2
'\\0x4b0'
>>> print s2
\0x4b0

如果您只是在控制台中填充字符串(即,它不通过print),Python会向您显示其表示形式:

>>> '\\0{}'.format(hex(1200)[1:])
'\\0x4b0'
>>> repr(s2)
"'\\\\0x4b0'"
>>> s2
'\\0x4b0'

修改(根据您的评论):

我认为这是一台旧HP绘图仪?

不要对shell显示为字符串的内容感到困惑。

您声明要生成一个\x<someNumGoesHere>字符串(或\x0<someNumGoesHere>字符串0

以下是:

>>> def angle_string(angle):
...    return '\\0{}'.format(hex(angle)[1:])
... 
>>> angle_string(1200)
'\\x04b0'
>>> print _
\x04b0
>>> angle_string(33)
'\\x021'
>>> print _
\x021

当您将字符串发送到您的设备时(通过OS文件/打印服务到RS232端口),它将与您格式化时一样。

修改2

字符串插值是这些string literals

的过程
>>> s1
'\n\n\t\tline'

翻译成这个:

>>> print s


       line

逻辑上,这些文字字符是单个字符:

>>> s1[0]
'\n'
>>> len('\\')
1

我的猜测是你打开串口s的方式是使用字符串是原始模式,所以字符串\\x0123以这种方式发送(原始模式)vs被解释为{ {1}}

你可以尝试解决这个问题:

\x0123

我认为您还需要在FileLike模式下打开串口,以便将字符串文字作为正确的单个字符发送。