2016-05-12 71 views
2

在蟒蛇,我想正则表达式,像这样的表达:正则表达式符号表达的分组

function_1(param_1,param_2,param_3)+function_2(param_4,param_5)*function_3(param_6)+function_4()-function_5(param_7,param_8,param_9,param_10) 

我用这正则表达式

(?P<perf_name>\w*?)\((?P<perf_param>[\w]+)*(?:,*(?P<perf_param2>[\w]+)?)*\) 

,但我坚持,因为到目前为止我不能得到不接近括号(pararam_2,param_8和param_9)的所有params_x

另外,我非常肯定有一些解决方案会阻止我使用一个单独的perf_param,而不是两个perf_paramperf_param2

任何想法?

+0

通过使用多个正则表达式,首先分割函数,然后获取参数,可能会更容易。此外,如果函数可以嵌套(即函数调用为参数),那么这将是一个正则表达式的问题。 –

+0

是的,但我不想给函数之间的运算符之间的限制 –

+0

好吧,即使只有一个正则表达式,也只能使用PyPi正则表达式模块。不知道你是否可以在你的项目中使用它。 –

回答

3

你应该做的是,在2个步骤:

(?P<perf_name>\w*)\((?P<perf_params>\w*(?:,\w+)*)\) 

This regex将让你的名字,而params为两组。然后,将第二组分成,

import re 
p = re.compile(r'(?P<perf_name>\w*)\((?P<perf_params>\w*(?:,\w+)*)\)') 
s = "function_1(param_1,param_2,param_3)+function_2(param_4,param_5)*function_3(param_6)+function_4()-function_5(param_7,param_8,param_9,param_10)" 
res = [(x.group("perf_name"), x.group("perf_params").split(",")) for x in p.finditer(s)] 
print(res) 
# => [('function_1', ['param_1', 'param_2', 'param_3']), ('function_2', ['param_4', 'param_5']), ('function_3', ['param_6']), ('function_4', ['']), ('function_5', ['param_7', 'param_8', 'param_9', 'param_10'])] 

参见Python demo

正则表达式匹配:

  • (?P<perf_name>\w*) - 0或多个字母数字/下划线字符
  • \( - 字面(
  • (?P<perf_params>\w*(?:,\w+)*) - 0+的序列接着是0个以上的单词字符(\w*)具有1+个单词字符的0+序列
  • \) - 关闭)