关于解析方法签名的正则表达式问题

发布于 2024-10-08 05:07:12 字数 300 浏览 1 评论 0原文

我正在尝试解析以下格式的方法签名:

'function_name(foo=<str>, bar=<array>)'

从中,我想要方法的名称、每个参数及其类型。显然我不想要 <> 字符等。参数的数量是可变的。

我的问题是:使用这个正则表达式时如何获取所有参数?我正在使用Python,但我只是在寻找一个总体思路。我是否需要命名组,如果需要,如何使用它们来捕获多个参数(每个参数都有其类型),全部在一个正则表达式中?

I'm trying to parse a method signature that is in this format:

'function_name(foo=<str>, bar=<array>)'

From this, I want the name of the method, and each argument and it's type. Obviously I don't want the <, > characters, etc. The number of parameters will be variable.

My question is: How is it possible to get all the parameters when using this regex? I'm using Python, but I'm just looking for a general idea. Do I need named groups and, if so, how can I use them to capture multiple parameters, each with it's type, all in one regex?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

热鲨 2024-10-15 05:07:12

您无法使用 Python 正则表达式匹配可变数量的组(请参阅 这个)。相反,您可以使用正则表达式和 split() 的组合。

>>> name, args = re.match(r'(\w+)\((.*)\)', 'function_name(foo=<str>, bar=<array>, baz=<int>)').groups()
>>> args = [re.match(r'(\w+)=<(\w+)>', arg).groups() for arg in args.split(', ')]
>>> name, args
('function_name', [('foo', 'str'), ('bar', 'array'), ('baz', 'int')])

这将匹配可变数量(包括 0)的参数。我选择不允许额外的空格,但如果您的格式不是很严格,您应该通过在标识符之间添加 \s+ 来允许它。

You can't match a variable number of groups with Python regular expressions (see this). Instead you can use a combination of regex and split().

>>> name, args = re.match(r'(\w+)\((.*)\)', 'function_name(foo=<str>, bar=<array>, baz=<int>)').groups()
>>> args = [re.match(r'(\w+)=<(\w+)>', arg).groups() for arg in args.split(', ')]
>>> name, args
('function_name', [('foo', 'str'), ('bar', 'array'), ('baz', 'int')])

This will match a variable number (including 0) arguments. I have chosen not to allow additional whitespace, although you should allow for it by adding \s+ between identifiers if your format isn't very strict.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文