如何正确处理文件输入中的转义序列

How to correctly handle escape squences in file input

我正在构建一个程序来读取用户的一些输入。如果此输入包含转义字符,例如 '\n',那么我需要像处理换行符一样处理它,而不是像文字字符串 r'\n' 那样处理。这必须适用于 所有可能的 转义序列,而不仅仅是像 \r、\n 等常见的转义序列。我试过使用 shlexast实现此行为,但我收到错误消息。

我的代码:

import shlex
import ast
text = r"result:"
escaped_text = ast.literal_eval(shlex.quote(text))
print(escaped_text)

错误:

...
File "<unknown>", line 1
    \x1b[31mError:
SyntaxError: unexpected EOF while parsing

shlex.quote 可能不是这里的工作工具,因为它有时会产生外引号,有时不会:

>>> print(shlex.quote("a"))
a
>>> print(shlex.quote("a\n"))
'a
'

literal_eval 将需要外部引号以允许字符串表达式被这样处理。 (您的错误是输入字符串没有得到 shlex.quote 添加的外引号。)

基本上你想要这样的东西:

escaped_text = ast.literal_eval(f"'{text}'")

但是如果text 本身包含' 符号就会有问题。不幸的是,为了处理这种特殊情况,您需要执行以下操作:

text2 = text.replace("'","'"'"'"'"'"'"'")

以便单个 ''"'"' 替换——此处更长的 "'"'"'"'"'"'"'" 是表示所示(5 个字符)字符串所需的源代码。

然后你可以这样做:

escaped_text = ast.literal_eval(f"'{text2}'")