Python 求值顺序,unicode字符串&;格式
这里有许多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_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']