【问题标题】:Regular expression to parse list of Python instructions between commas用于解析逗号之间的 Python 指令列表的正则表达式
【发布时间】:2019-11-29 08:47:22
【问题描述】:

我正在编写一个解析器,并且在某些时候,我期待一个 Python 指令列表和/或逗号之间写入的值。例如,

n >= 5, n < 20, m == len([1, 2, 3]), m + 1 == func(myObject.myMethod());

这只是一个例子,实际上我希望能够解析任何有效的 Python 表达式。

我的语法有如下形式的规则:

EXPRESSION ("," EXPRESSION)* ";"

EXPRESSION 是一个可以接受任何 Python 指令的正则表达式。当然,由于逗号可能会出现在我的表达式中,所以我不知道如何将它用作分隔符。不过,在我看来,必须有一个正则表达式,因为任何人都可以清楚地解析上面示例中的四个表达式。有什么想法吗?

我当前的正则表达式是EXPRESSION = [^,;]+,但这当然只适用于非常简单的情况;上面的例子不能用这个来解析。

【问题讨论】:

  • 您是否尝试过为给定的问题创建任何正则表达式?

标签: python regex parsing


【解决方案1】:

这是不可能的,因为 Python 指令中的逗号可能会被误解为分隔符,但仍会产生有效的 Python 指令。

这是一个例子:

a = 1, b = ((2, 3), 4), a, b = b, a, b = a

这可以解释为:

a = 1
b = ((2, 3), 4), a
b = b, a
b = a

或如:

a = 1
b = ((2, 3), 4)
a, b = b
a, b = a

或如:

a = 1
b = ((2, 3), 4)
a, b = b, a
b = a

所有都是有效的代码。您无法知道哪个是预期的。

【讨论】:

  • 我明白了,谢谢!那么实现我想要的唯一方法是使用Python从未使用过的符号作为分隔符,对吗?我正在考虑这个,但它确实让我的语言的可读性降低了很多。
  • 你可以使用 JSON 吗?然后你会有["a = 1", "b = ((2, 3), 4)", "a, b = b, a", "b = a"]。双引号将使用反斜杠、...等进行转义,所有这些都由 JSON 语法定义。见JSON encoder and decoder
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多