我想在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,}.*\)
我应该用什么表达呢?
2条答案
按热度按时间4ioopgfo1#
为了好玩,你可以递归地
sub
/用占位符(* 例如连字符 *)替换最右边的函数,并且只在最后,count
每个表达式中的剩余参数:Regex:[ demo - first iteration ]
输出量:
来自 * 评论 *:
我有一个Pandas的框架,里面有一堆这样的表情。我想删除具有两个以上参数的函数调用的行
然后,您可以使用 boolean indexing,其逻辑与上面使用的相同:
输出量:
jmo0nnb32#
使用
Pypi
正则表达式的递归方法:(?2)
引用):一个既不包含逗号也不包含括号的字符串,或者一个函数调用。
(可能的问题:如果参数看起来像
a * (b + c)
呢?=>目前尚未考虑)([^(),]+|(?3))
([^(),]+|(\b\w+\s*\((?:([^(),]+|(?3))(?:\s*,\s*(?2))*)*\)))
逗号分隔的0个或多个参数的列表,即
(?2)
逗号前/后可以有0个或多个空格
(?:(?2)(?:\s*,\s*(?2))*)*
(?3)
引用):函数名+ 0或多个空格+ '(' +参数+ ')'
(\b\w+\s*\((?:([^(),]+|(?3))(?:\s*,\s*(?2))*)*\))
然后,所需的模式,具有3个或更多参数的函数,可以表示为:
(\b\w+\s*\(([^(),]+|(\b\w+\s*\((?:([^(),]+|(?3))(?:\s*,\s*(?2))*)*\)))(?:\s*,\s*(?2)){2,}\))
代码:
输出量: