【问题标题】:Optimal way to parse an if condition to extract variable names解析 if 条件以提取变量名的最佳方法
【发布时间】:2020-06-12 02:44:28
【问题描述】:

我有一个 if 条件作为字符串,并想提取变量名。
示例 1:

Input: "((a>5 and b<20) or (c>30))"
Output: {"a", "b", "c"}

示例 2:

Input: "a==20"
Output: {"a"}

仅提取变量名的最佳方法是什么?
正则表达式会为此工作吗?条件可以是任意长度。
我还考虑过在空间上进行拆分,然后修剪掉不需要的字符,直到我们只得到变量名。

【问题讨论】:

  • 你写过代码吗?如果没有,任何人都很难提供帮助。
  • 我不认为你的条件的语法是规则的,特别是如果它们可以递归嵌套的话。您可以尝试编写递归下降解析器或类似的东西,将整个条件解析成一棵树,然后从树的叶子中提取变量名。
  • @RaghavMalik 树的建立时间会是不必要的开销吗?因为我将在提取变量名后丢弃树。

标签: python regex parsing


【解决方案1】:

任何类似 Python 的标识符都符合定义良好的正则表达式:

ident = "[a-zA-Z_][a-zA-Z_0-9]*"

只要你没有引用字符串,你可以在你的表达式中找到所有标识符,然后删除所有关键字(它们的列表已关闭),例如:

keywords = {"and", "or"} # Expand as needed
s = "((a>5 and b<20) or (c>30))"
[i for i in re.findall(ident, s) if i not in keywords]
#['a', 'b', 'c']

请注意,如果存在常量字符串(例如,'abc'),它可能会被错误地识别为变量。

【讨论】:

  • 您能解释一下这将如何处理示例 #1 中的括号和常量(例如 5、20)吗?
  • 括号和常量与正则表达式不匹配。
猜你喜欢
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
相关资源
最近更新 更多