【问题标题】:Regex question about parsing method signature关于解析方法签名的正则表达式问题
【发布时间】:2010-12-20 20:52:40
【问题描述】:

我正在尝试解析这种格式的方法签名:

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

由此,我想要方法的名称、每个参数及其类型。显然我不想要&lt;&gt; 等字符。参数的数量是可变的。

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

【问题讨论】:

    标签: python regex method-signature


    【解决方案1】:

    您无法使用 Python 正则表达式匹配可变数量的组(请参阅this)。相反,您可以使用正则表达式和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+ 来允许它。

    【讨论】:

    • 再想一想,这行不通。 params 部分只允许 2 个参数,不多不少。
    • 这正是我最初遇到的问题。我可以将多个相同的模式与* 等匹配,但我无法将多个值捕获到组中(无需连续手动键入相同的组正则表达式 15 次,这根本不是很干净) .
    • @orokusaki 好的,似乎使用单个正则表达式是不可能的。请参阅我的新答案,它将正则表达式与split() 结合在一起。它适用于任何数字,经过测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多