2016-05-12 73 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+序列
  • \) - 關閉)