【问题标题】:How to correctly handle escape squences in file input如何正确处理文件输入中的转义序列
【发布时间】:2020-12-15 05:03:38
【问题描述】:

我正在构建一个程序来读取用户的一些输入。如果此输入包含转义字符,例如,'\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

【问题讨论】:

  • 可能是+ r"\x1b[0m"(注意第二个r")?
  • 无法复制 - 为我工作。
  • 由于某种原因,这个例子现在可以......奇怪
  • 是的,仍然无法重现错误。但很高兴它现在对你有用:)
  • @alani 再次编辑...问题似乎仅在文本为"result:" 时发生。我不知道为什么..

标签: python python-3.x input unicode-escapes


【解决方案1】:

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}'")

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多