我在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
有什么建议吗?
感谢您的时间......
答案 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)
您不能仅使用正则表达式执行此操作。这有点递归。您应该首先匹配最外部的函数及其参数,打印函数的名称,然后执行相同的操作(匹配函数名称,然后是其参数)及其所有参数。仅凭正则表达是不够的。