如何正确处理文件输入中的转义序列
How to correctly handle escape squences in file input
我正在构建一个程序来读取用户的一些输入。如果此输入包含转义字符,例如 '\n',那么我需要像处理换行符一样处理它,而不是像文字字符串 r'\n'
那样处理。这必须适用于 所有可能的 转义序列,而不仅仅是像 \r、\n 等常见的转义序列。我试过使用 shlex
和 ast
实现此行为,但我收到错误消息。
我的代码:
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}'")
我正在构建一个程序来读取用户的一些输入。如果此输入包含转义字符,例如 '\n',那么我需要像处理换行符一样处理它,而不是像文字字符串 r'\n'
那样处理。这必须适用于 所有可能的 转义序列,而不仅仅是像 \r、\n 等常见的转义序列。我试过使用 shlex
和 ast
实现此行为,但我收到错误消息。
我的代码:
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}'")