1

我有一个看起来像的字符串列表

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

我想只提取参数。我尝试了以下方法:

re.findall(r'\w[\w\d_]+(?!\()', string)

但是这会返回

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

首先,我对为什么看到 有点困惑'20',因为我指定字符串应该以单词字符开头。其次,我想知道如何改进我的前瞻性以匹配我正在寻找的内容。

我应该注意,有些字符串没有功能,看起来像

"value1 + value_two"

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

4

3 回答 3

1

这是一个应该更好的正则表达式:

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

例如:

>>> s = "funcname(arg, another_arg)*20 + second_func(arg1, arg2)"
>>> re.findall(r'(?!\w+\()[^\W\d]\w+', s)
['arg', 'another_arg', 'arg1', 'arg2']

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

这使用与您的正则表达式相同的逻辑,但通过将前瞻移动到字符串的开头,您可以防止类似funcnamfrom的匹配funcname(...)。这是一个类似的替代方案:

[^\W\d]\w+(?![\w(])
于 2012-04-20T16:08:08.250 回答
1

这可能是一个糟糕的解决方案,但它对我有用......:

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]!='(' ]

其他答案可能会比这更好......这样做的一个好处是它可以让您在事后轻松挑选功能 - 它们以'('结尾

于 2012-04-20T16:15:32.857 回答
1
>>> 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']
于 2012-04-20T16:28:13.777 回答