函数定义上的Regex findall。想要匹配参数而不是函数

2024-10-02 00:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字符串的列表

"funcname(arg, another_arg)*20 + second_func(arg1, arg2)"

我只想拔出args。我试过以下方法:

^{pr2}$

然而,这又回来了

['funcnam', 'arg', 'another_arg', '20', 'second_fun', 'arg1', 'arg2']

首先,我有点困惑为什么我看到'20',因为我指定字符串应该以单词字符开头。第二,我想知道如何提高我的前瞻性,以符合我所寻找的。在

我应该注意到有些字符串没有函数,看起来像

"value1 + value_two"

所以我不能简单地在括号里搜索。在


Tags: 方法字符串列表anotherargargs单词func
3条回答

下面是一个可以更好地工作的正则表达式:

(?!\w+\()[^\W\d]\w+

例如:

^{pr2}$

[^\W\d]相当于[a-zA-Z_]。在

这使用与regex相同的逻辑,但是通过将lookahead移到字符串的开头,可以防止类似funcnam来自{}的匹配。下面是一个类似的选择:

[^\W\d]\w+(?![\w(])
>>> pattern = '[a-zA-Z_]\w*(?![\(\w])'
>>> re.findall(pattern, "funcname(arg, another_arg)*20 + second_func(arg1, arg2)")
['arg', 'another_arg', 'arg1', 'arg2']
>>> re.findall(pattern, "value1 + value_two")
['value1', 'value_two']

这可能是一个不好的解决方案,但对我有用…:

R=r"[a-zA-Z_]\w*(?:s*\()?"  #This captures everything, leaving the left parenthesis on functions
values=filter(lambda x: '(' != x[-1], re.findall(R,s))  #now filter off everything containing a left parenthesis
#Or if you prefer list comprehensions...
values=[ x for x in re.findall(R,s) if x[-1]!='(' ]

其他的答案可能会比这个更好……这个方法的一个好处是,它允许你在函数以'('结尾)之后很容易地挑选出它们

相关问题 更多 >

    热门问题