正则表达式匹配函数名称和Python中的所有参数

Dan*_*ats 9 python regex

假设我有一个如下字符串:

"func(arg1, arg2, arg3, arg4, ..., argn)"
Run Code Online (Sandbox Code Playgroud)

编辑:此功能不是某种特定语言.它只有这种格式.如果它更容易,不要把它看作函数调用,只是一个字符串.

我想写一个正则表达式来匹配函数和每个参数.我是用Python写的.所需的输出是:

{"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]}
Run Code Online (Sandbox Code Playgroud)

编辑:虽然参数可以是函数调用,但是一旦我创建了一个有效的函数,我就可以很容易地递归地尝试将它们与相同的正则表达式匹配.通过这个我的意思是我可以用每个参数递归函数.但这并不是真的相关.我不是想创建一个解释器,只是为了识别这些论点.

以下是我对此的尝试:

import re
s = "func(arg1, arg2, arg3, arg4, argn)"
m = re.match(r"(?P<function>\w+)\s?\((?P<args>(?P<arg>\w+(,\s?)?)+)\)", s)
print m.groupdict()
Run Code Online (Sandbox Code Playgroud)

这是输出:

{'function': 'func', 'args': 'arg1, arg2, arg3, arg4, argn', 'arg': 'argn'}
Run Code Online (Sandbox Code Playgroud)

函数匹配得很好,参数集也是如此.但是,我似乎无法匹配个别论点.这是我的正则表达式的问题,还是Python正则表达式匹配的限制?

EDIT2:我知道我现在可以使用以下代码拆分参数:

d["arg"] = d["args"].split(", ")
Run Code Online (Sandbox Code Playgroud)

但我想知道我是否可以用正则表达式完成整个工作.特别是,我想知道为什么"arg"只匹配最后一个参数.

EDIT3:我想我(1)希望弄清楚为什么Python每次只匹配最后一个参数,以及(2)我是否可以在Python中进行Scheme风格的模式匹配.或者,如果在Python中存在与Scheme样式模式匹配一​​样直观的东西.我查看了ast模块,它的语法非常复杂.

小智 8

正则表达式无法解析复杂的编程语言.

如果您只是想解析Python,我建议您查看ast模块,它将为您解析它.


mVC*_*Chr 5

看起来你有90%,为什么不交换argargs分组,并做:

import re

fn_match = re.match(r"(?P<function>\w+)\s?\((?P<arg>(?P<args>\w+(,\s?)?)+)\)", s)
fn_dict = fn_match.groupdict()
del fn_dict['args']
fn_dict['arg'] = [arg.strip() for arg in fn_dict['arg'].split(',')]
Run Code Online (Sandbox Code Playgroud)