【问题标题】:Order of evaluation , unicode string & format求值顺序、unicode字符串和格式
【发布时间】:2020-05-15 07:57:54
【问题描述】:

这里有很多 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”,其次,执行format

作为错误信息,unicode字符必须是“\UXXXXXXXXXX”的块。

Unicode 字符在第一次被评估,但这不是当时合适的块。

format函数执行时,unicode字符必须构造完整。

我知道大写字符串 'r' 可以转义此错误消息,但它不会生成 unicode 字符串。

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

如果我删除'\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 映射中的字符序列。

【问题讨论】:

  • list(map(chr, range(16))) 不会产生您想要的输出吗?
  • 那么你想要的输出是什么?
  • @schwobaseggl 你的意思是def m(i): return ["\U00000{:0>3}".format(str.upper(hex(i))[2:])] list(map(m, range(16))) ?我认为这会导致同样的错误。
  • 不,我的 sn-p 替换了整个理解:unicode_strings = list(map(chr, range(16)))
  • 另请注意。您不会看到它表示为'\U00000001',而是'\x01',它们都表示相同的字符。 print(["\U00000001"]) -> ['\x01']

标签: python python-3.x string unicode format


【解决方案1】:

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

unicode_strings = [chr(i) for i in range(16)]

如果问题是为什么会发生这种情况,format 文档可能对此有点微妙:*)

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

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

因此,如果您尝试为更大的字符串生成做类似的事情,您可以按如下方式进行:

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

*) PEP-498 在 f-strings 上可能更明确一些(在这方面的机制是相同的),即:

f-strings 被解析成文字字符串和表达式...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-03
    • 2020-05-05
    • 1970-01-01
    • 2019-05-01
    • 2018-01-28
    • 2015-07-03
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多