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

与Python中的函数名和所有参数匹配的正则表达式,python,regex,Python,Regex,假设我有一个字符串,如下所示: "func(arg1, arg2, arg3, arg4, ..., argn)" 编辑:此函数不是用某种特定语言编写的。它只有这种格式。如果这样做更简单,不要将其视为一个函数调用,而只是一个字符串 我想写一个正则表达式来匹配函数和每个参数。我是用Python写的。该系统的预期输出为: {"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]} 编辑:虽然参数可以是函数调用,但一旦创建了一个有效的

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

"func(arg1, arg2, arg3, arg4, ..., argn)"
编辑:此函数不是用某种特定语言编写的。它只有这种格式。如果这样做更简单,不要将其视为一个函数调用,而只是一个字符串

我想写一个正则表达式来匹配函数和每个参数。我是用Python写的。该系统的预期输出为:

{"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]}

编辑:虽然参数可以是函数调用,但一旦创建了一个有效的正则表达式,我就可以轻松地递归地尝试将它们与相同的正则表达式匹配。我的意思是我可以用每个参数在函数上递归。但这并不真正相关。我不是在尝试创建一个解释器,只是为了识别参数

以下是我的尝试:

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()
函数匹配得很好,参数集也很好。然而,我似乎无法与个人观点相匹配。这是我的正则表达式的问题,还是Python正则表达式匹配的限制

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

d["arg"] = d["args"].split(", ")
但是我想知道我是否可以用正则表达式完成全部工作。特别是,我想知道为什么“arg”只与最后一个参数匹配


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

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


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

看起来您已经完成了90%,为什么不直接交换
arg
args
分组并执行以下操作:

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(',')]
重新导入
fn\u match=re.match(r“(?P\w+)\s?\(?P(?P\w+)(,\s?)+)\”,s)
fn_dict=fn_match.groupdict()
del fn_dict['args']
fn_dict['arg']=[fn_dict['arg']中arg的arg.strip()。拆分(',')]

回答您问题的最后一部分:不。Python没有任何类似Scheme的“匹配”,也没有类似ML/Haskell的模式匹配。它所拥有的最接近的东西是分解类似这样的东西的能力

>>> (a, [b, c, (d, e)]) = (1, [9, 4, (45, 8)])
>>> e
8
要像这样提取列表(在Python3.x中)的开头和结尾

>>> head, *tail = [1,2,3,4,5]
>>> tail
[2, 3, 4, 5]
虽然有一些模块在python中进行真正的模式匹配,但我不能保证它们的质量


如果我必须这样做,我会以稍微不同的方式实现它——可能能够输入一个类型和可选参数(例如长度或确切内容)以及一个在匹配时要调用的函数,比如match([list,length=3,check=(3,str),func]),它将匹配(list uusomestr)并在作用域中使用somestr调用func,您还可以添加更多的模式。

这个函数调用是用某种特定的语言实现的吗?您不应该使用正则表达式来解析已经存在正确/完整解析器的语言……正则表达式无法做到这一点(假设您希望匹配各个参数,这些参数本身可能是函数调用)。您需要一个实际的解析器。如果你坚持写你自己的,那么读一下:你可能想看看你是否打算做更复杂的事情。“我可以很容易地递归地尝试用相同的正则表达式匹配[参数]”——不,你不容易做到。正则表达式不是那样工作的。@Eduardo,是的,我们知道理论上可以这样做,但实际上不应该这样做。我正试图将整个过程作为正则表达式来描述。这不可能吗?无法获取所需的参数的结果列表。当你有一个完整的工具箱时,为什么只使用瑞士军刀呢?我不想解析Python,只是捕获一个非常特定的语法。从我读到的一小部分内容来看,ast模块似乎(1)特定于Python,并且(2)对于我正在尝试做的事情来说是相当复杂的。您能提供一个代码示例,以获得
ast
以返回Python中函数定义的参数吗?在的帮助下,我能够使用
ast
找到它。对于Python,您可以执行
parsed=ast.parse(“def foo(a,b,c):\n\tpass”)
后跟
result={“function”:parsed.body[0]。name,“args”:[ast_arg.arg代表parsed.body[0]中的ast_arg。args]}
>>> head, *tail = [1,2,3,4,5]
>>> tail
[2, 3, 4, 5]