Python 求值顺序,unicode字符串&;格式

Python 求值顺序,unicode字符串&;格式,python,python-3.x,string,unicode,format,Python,Python 3.x,String,Unicode,Format,这里有许多unicode映射中的字符串 unicode_strings = ["\U00000{:0>3}".format(str.upper(hex(i))[2:]) for i in range(16)] 但此代码会发出错误消息 SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-6: truncated \UXXXXXXXX escape 这是由于评估的顺序造成的

这里有许多unicode映射中的字符串

unicode_strings = ["\U00000{:0>3}".format(str.upper(hex(i))[2:]) for i in range(16)]
但此代码会发出错误消息

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-6: truncated \UXXXXXXXX escape
这是由于评估的顺序造成的

首先计算“\U00000”,然后执行
格式

作为错误消息,unicode字符必须是“\UXXXXXXXX”的块

Unicode字符将在第一次计算,但此时这不是合适的块

在执行format函数时,必须完全构造unicode字符

我知道cap字符串“r”可以转义此错误消息,但它不生成unicode字符串

我应该如何在第一次将“\U”附加到字符串或执行format函数

如果我删除“\U”,结果就是乌托邦

 ['00000001',
 '00000002',
 '00000003',
 '00000004',
 '00000005',
 '00000006',
 '00000007',
 '00000008',
 '00000009',
 '0000000A',
 '0000000B',
 '0000000C',
 '0000000D',
 '0000000E',
 '0000000F']
更新: 我想要这样的结果

['\U00000001',
 '\U00000002',
 '\U00000003',
 '\U00000004',
 '\U00000005',
 '\U00000006',
 '\U00000007',
 '\U00000008',
 '\U00000009',
 '\U0000000A',
 '\U0000000B',
 '\U0000000C',
 '\U0000000D',
 '\U0000000E',
 '\U0000000F']

我想获得Unicode映射中的字符序列。

不完全确定您到底想要什么,但考虑到例如
\U00000000
\x00
相同,要生成此列表,以下理解似乎更有意义:

unicode_strings = ["\U00000{:0>3}".format(str.upper(hex(i))[2:]) for i in range(16)]
unicode_strings = [chr(i) for i in range(16)]
如果问题是为什么会发生这种情况,文档可能对此有点微妙:)

调用此方法的字符串可以包含由大括号
{}
分隔的文本或替换字段。。。返回字符串的副本,其中每个替换字段都替换为相应参数的字符串值

但基本上,文字字符串和“替换字段”是被标识的,并且每一个都被认为是这样的。在您的情况下,将考虑字符串文字
\U00000
,该字符串无效,因为在
\U
之后需要四个字节的十六进制值。或者换句话说,这实际上不是顺序问题(首先是文字,然后是表达式),而是如何将
str
分割成块/进行处理(首先识别文字和表达式,然后进行处理)

因此,如果您试图为更大的字符串生成执行类似操作,您可以按如下方式执行:

somelist = [f"abcd{chr(i)}efgh" for i in range(16)]

*)关于f-字符串可能更明确一些(在这方面,机制是相同的),即:

f字符串被解析为文本字符串和表达式

大括号外的f字符串部分是文字字符串。然后对这些文字部分进行解码。对于非原始f字符串,这包括将反斜杠转义转换为相关的unicode字符,例如
'\n'
'\'
'\xhh'
'\uxxx'
'\uxxxxx'
,以及命名的unicode字符
'\n{name}


list(map(chr,range(16)))
不会产生你想要的输出吗?那么你想要的输出是什么呢?@schwobasegll你的意思是
defm(i):return[“\U00000{:0>3}”。format(str.upper(hex(i))[2:])]list(map(m,range(16))
?我认为这会导致同样的错误。不,我的代码片段取代了整个理解:
unicode\u strings=list(map>(chr,范围(16))
另请注意。您将不会看到它表示为
'\U00000001'
,而是
'\x01'
,两者都表示相同的字符。
打印([“\U00000001]”)
->
['\x01']