使用%和转义序列的字符串格式之间的奇怪交互。蟒蛇

时间:2012-09-16 14:10:03

标签: python string-formatting

我知道我可以使用转义序列获取unicode字符,如下所示:

>>> print "\3"
♥

我只想查看可用的ASCII字符并写下:

for i in xrange(1, 99):
    print "\%o" % i

并打印“\ 1”,“\ 2”,“\ 3”等,所以不是unicode字符。然后我尝试使用%s,%r和%d,但这些似乎都没有。

这比查看可用的ASCII字符要有趣得多,所以我开始阅读有关字符串格式化的内容,并最终完成了这个工作:

for i in xrange(1, 99):

    print "{:c}".format(i)

问题是 - 为什么初始代码不起作用?

3 个答案:

答案 0 :(得分:2)

Python将\%o解释为'字面反斜杠后跟字符串格式代码'; \%并不意味着python文字中的任何内容,因此字面上包含反斜杠。

您正在寻找chr() function

for i in xrange(1, 99):
    print chr(i)

\字符转义仅适用于python文字。你可以指示python解释包含文字\反斜杠脓代码的任意字符串,使用string_escape编解码器解释为python字符串文字:

>>> print repr('\\n'.decode('string_escape')
'\n'

请注意,指定unicode文字的正确方式是使用\uxxxx格式,并使用unicode字符串文字:

>>> print u'\u2665'
♥

也可以使用\x00转义序列生成原始字节:

>>> print repr('\x12')
'\n'

答案 1 :(得分:2)

字符串文字中的转义序列在“解析时”处理,而不是在“运行时”处理。 如果你写

"\%o"

Python解析器看到一个反斜杠后跟一个百分号,因为这不是一个有效的转义序列,它只保留两个字符,然后还会添加o作为普通字符(请注意,在这个Python中是不同的从例如C ++编程语言,它将该字符串解释为"%o",因为在该语言中,百分号之前的反斜杠仅被解释为百分号)。

在运行时,格式化操作符将在左侧看到由三个字符组成的字符串,一个反斜杠和一个%o序列,这​​是将被右侧替换的部分,例如字符串"\\1"表示输入值1,该字符串显示为\1

答案 2 :(得分:1)

Python源代码中的字符串文字在词法分析期间被解释 - 这是Python编译器执行的源代码处理的第一步。解析转义序列,并且只将结果字符串存储在内存中。这就是为什么,例如。

>>> "A"
'A'
>>> "\x41"
'A'

产生完全相同的字符串。实际打印字符串或执行字符串格式化时,不会处理转义序列。打印基本上是指将字符串的内容复制到终端。格式化意味着用所需内容插入%{}占位符。字符串的其余部分保持不变。

格式化opartion的结果

>>> "\%03o" % 65
'\\101'

是一个由四个字符\101组成的字符串。 (在交互式解释器中,显示了此字符串的表示;这就是您看到引号和双后斜杠的原因。)另一方面,字符串文字"\101"是一个字符串只有一个字符,即大写A

正如Martijn Pieters所指出的,你可以使用string_escape编解码器明确要求解释转义序列:

>>> ("\%03o" % 65).decode("string_escape")
'A'