使用正则表达式匹配具有两个以上参数的函数

问题描述 投票:0回答:1

我想在Python中编写一个正则表达式来匹配具有两个以上参数的函数,以便以下表达式匹配:

function(1, 2, 3)
function(1, 2, 3, 4)
function(1, function(1, 2), 3)
function(function(function(1, 2), 2), 2, 3, 4)

但以下情况则不然:

function(1, 2)
function(1, function(1, function(1, 2)))
function(1, function(function(1), 2))

我最好的尝试是以下表达式,它仅适用于没有嵌套函数的情况:

\w+\((?:.*,){2,}.*\)

我应该用什么表达方式来代替?

python regex pcre parentheses
1个回答
0
投票

为了好玩,您可以递归删除内部函数并计算剩余参数:

import re

#https://peps.python.org/pep-0008/#function-and-variable-names
pyfunc = r"\b[a-zA-Z_][a-zA-Z0-9_]*"

pat = fr"({pyfunc}\(.*)(?:{pyfunc})?({pyfunc}\(.+?\))(.+)"

def fn(s):
    if len(re.findall(pyfunc, s)) > 1:
        new_s = re.sub(pat, r"\1-\3", s)
        return fn(new_s)
    else:
        return s

正则表达式:[演示]

输出:

# `text` is the multistring holding your expressions

for exp in text.splitlines():
    if (n:=fn(exp).count(",")) > 1:
        print(f"{exp:<50}", n, f"{'MATCH':>10}")
    else:
        print(f"{exp:<50}", n, f"{'NO-MATCH':>10}")

function(1, 2, 3)                                  2      MATCH
function(1, 2, 3, 4)                               3      MATCH
function(1, function(1, 2), 3)                     2      MATCH
function(function(function(1, 2), 2), 2, 3, 4)     3      MATCH
function(1, 2)                                     1   NO-MATCH
function(1, function(1, function(1, 2)))           1   NO-MATCH
function(1, function(function(1), 2))              1   NO-MATCH
© www.soinside.com 2019 - 2024. All rights reserved.