在Python中使用RegEx的函数解析器

时间:2009-03-12 08:52:45

标签: python regex

我在Fortran中有一个源代码(几乎不相关),我想解析函数名和参数。

例如使用

(\w+)\([^\(\)]+\)

a(b(1 + 2 * 2), c(3,4))

我得到以下内容:(如预期的那样)

b, 1 + 2 * 2
c, 3,4

我需要的地方

a, b(1 + 2 * 2), c(3,4)
b, 1 + 2 * 2
c, 3,4

有什么建议吗?

感谢您的时间......

5 个答案:

答案 0 :(得分:2)

我不认为这是正则表达式的工作......它们无法真正处理嵌套模式。

这是因为正则表达式被编译成FSM(有限状态机)。为了解析任意嵌套的表达式,您不能使用FSM,因为您需要无限多个状态来跟踪任意嵌套。另请参阅此SO thread

答案 1 :(得分:2)

这是一种非线性语法 - 您需要能够对一组允许的规则进行递归。查看pyparsing,通过可读的规范进行简单的CFG(Context Free Grammar)解析。

自从我写完CFG以来已经有一段时间了,我可能已经生锈了,所以我会把你推荐给Python EBNF来了解如何为一个子集构建一个语言语法。

编辑:如果示例总是很简单,您可以编写一个小的状态机类/函数,迭代标记化的输入字符串,如@Devin Jeanpierre所示。

答案 2 :(得分:2)

可以使用正则表达式 - 使用它们来标记字符串,并使用标记。即见re.Scanner。或者,只使用pyparsing。

答案 3 :(得分:2)

你可以看一下PLY (Python Lex-Yacc),它(在我看来)使用起来非常简单并且记录良好,而且附带一个calculator example,这可能是一个很好的起点。

答案 4 :(得分:1)

您不能仅使用正则表达式执行此操作。这有点递归。您应该首先匹配最外部的函数及其参数,打印函数的名称,然后执行相同的操作(匹配函数名称,然后是其参数)及其所有参数。仅凭正则表达是不够的。