【问题标题】:AST not parsing strings with escaped backslashes correctly [duplicate]AST没有正确解析带有转义反斜杠的字符串[重复]
【发布时间】:2019-05-05 02:37:01
【问题描述】:

请注意 我不能在创建时修改s 我最好通过ast寻找一种方法

下面的表达式

import ast
s = 'func(arg="\\\\my\\network\\drive")'
ast.parse(s).body[0].value.keywords[0].value.s

将返回

'\\my\network\\drive'

有没有办法在不手动修改s的情况下解决这个问题

ast.parse(s.replace('\\', '\\\\')).body[0].value.keywords[0].value.s

预期的输出是:

"\\\\my\\network\\drive"

【问题讨论】:

  • 一个不错的解决方法是s.encode("unicode_escape"),因为看起来这实际上是stackoverflow.com/q/18707338/4013571 的复制,因为ast 中没有内置方法。标记为重复,因为这将帮助经验不足的编码人员使用ast
  • s.encode("unicode_escape") 不会帮助您处理换行符或转义引号等问题。如果您的输入字符串跨越两行,unicode-escape 会将其转换为反斜杠-n。如果您的输入已转义引号,unicode-escape 将不知道是否应该转义其中的任何一个,并且不会转义任何一个。
  • 那么更好的方法是.replace() 吗?在我的特定实例中,输入字符串 s 将始终是单个函数表达式

标签: python escaping abstract-syntax-tree


【解决方案1】:

ast 模块实际上是在正确解析输入。您误解了所涉及的字符串表示形式。根据你实际需要的结果,解决方案可能是使用原始字符串文字(注意r):

s = r'func(arg="\\\\my\\network\\drive")'

就目前而言,您编写的字符串文字代表 Python 源代码

func(arg="\\my\network\drive")

而不是源代码

func(arg="\\\\my\\network\\drive")

ast 正在处理\n 转义,就像 Python 语法所说的那样处理它。


如果您希望通过某种方式撤消对已处理字符串的字符串转义处理,这是不可能的。字符串转义处理不是从输入到输出的单射映射。没有办法恢复未处理的表格;您首先需要避免字符串转义处理。

【讨论】:

  • 我在输入时没有得到原始字符串类型,所以我认为这不是答案
  • @AlexanderMcFarlane:那么,您如何接受意见?大多数自动获取输入的方式已经像原始字符串文字一样。你做错了某事来达到这一点。
  • 我确实明白你的意思 - “你做错了事才能达到这一点。” - 我正在从其他人创建的脚本中获取输入,该脚本将包含s 作为有效的python 代码。这不能修改。返回源代码并说“由于我解析它的方式,您的有效python 代码不起作用”,这不是一个有效的答案。这是挑战的一部分
  • @AlexanderMcFarlane:您输入的不是正确的 Python 源代码。它错误地使用了反斜杠转义。试图在解析阶段解决这个问题是个坏主意。
  • 我认为python -c 'func(arg="\\\\my\\network\\drive")' 是完全有效的,ast 应该能够解析
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
相关资源
最近更新 更多