在Python f-string中使用\u

3

有没有办法在f-string中包含\u,在格式化之后延迟转义序列的评估?

一个实际的例子。 假设我有以下代码(python3)

i="0222"
print(f'\u{i}')

这是无效的并返回

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX escape

有没有一种方法可以在字符串中替换{i}后延迟评估转义序列\u


print(f"{chr(int(i, 16))}") - Bijay Regmi
2个回答

2

最简单的方法是这样的:

i=0x0222
print(f'{chr(i)}')


在fstring中替换"\u"前缀的数据部分是不行的,因为\uXXXX模式被认为是一个单个字符:Python将尝试将{解析为其中之一的“X”,并引发SyntaxError,因为它不是十六进制数字。

话虽如此,还有其他编写该替换的方式,以便您可以通过数字进行内联动态unicode代码点编码。其中一种方式是直接使用"unicodeescape"编解码器-但您的字符串必须先转换为字节:

i = "0222"
f"\\u{i}".encode("ASCII", errors="backslashreplace").decode("unicode_escape")

所以 - 我们在这里做了三件事情:首先,"double \" 转义了实际的斜杠并在第一个字符串中产生了两个字符:" " 和 "u" 字符 - 不像 "\u" 是一个序列,它将指示解析器需要四个十六进制数字跟随。
之后,在 fstring 中的 {i} 将按预期工作:4 个数字只是在那里呈现。 然后,使用限制为 "ASCII" 编解码器将生成的字符串转换为字节对象,但告诉它将不能表示为 ASCII 的任何字符转换为反斜杠序列在最终的字节字符串中。这种转换不会影响 \u0222 序列本身,但它将确保文本中可能存在的任何其他 Unicode 字符都将被保留并允许往返传输。

对字节对象调用 ".decode",并且将在程序运行时(而不是在源代码解析时)"手动"执行您一开始尝试的 "\u" 替换。此代码将 "看到" \u0222 序列并产生所需的 Ȣ 字符。

由于这样写很麻烦,您可以创建一个实用函数:

def r(text, character_codes):
    return (text.format(**character_codes)
        .encode("ASCII", errors="backslashreplace")
        .decode("unicode_escape")
    )

...
i = "0222"
text = r("\\u{i}", locals())

1
这就是它。如果你不想更改当前的 i,你可以使用 print(f"{chr(int(i, 16))}") - Bijay Regmi

2
有没有方法在f字符串中包含\u,延迟转义序列的评估直到格式化之后? 没有。 转义序列在字符串解析期间执行。 只需使用内置的{{link1:chr}},它采用代码点(作为整数)并返回相应的字符串。 如果由于某种愚蠢的原因您真的绝对想要使用f-strings,那么您需要在字符串对象中创建转义序列本身:
>>> i = 0x0222
>>> s = f'\\u{i:04x}'

然后应用 "unicode_escape" 编解码器,它在运行时解码转义字符

>>> codecs.decode(s, encoding='unicode_escape')
'Ȣ'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接