9

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

"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()

这是输出:

{'function': 'func', 'args': 'arg1, arg2, arg3, arg4, argn', 'arg': 'argn'}

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

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

d["arg"] = d["args"].split(", ")

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

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

4

3 回答 3

9

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

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

于 2012-04-15T17:21:58.163 回答
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(',')]
于 2012-04-15T17:38:40.690 回答
1

回答你问题的最后一部分:不。Python 没有任何类似于 Scheme 的“匹配”的东西,也没有像 ML/Haskell 这样的模式匹配。它最接近的是能够像这样解构事物

>>> (a, [b, c, (d, e)]) = (1, [9, 4, (45, 8)])
>>> e
8

并像这样提取列表的头部和尾部(在 Python 3.x 中)......

>>> head, *tail = [1,2,3,4,5]
>>> tail
[2, 3, 4, 5]

虽然有一些模块在 python 中进行真正的模式匹配,但我不能保证它们的质量。

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

于 2012-04-17T00:33:02.830 回答