2012-04-15 82 views
6

所有參數假設我有一個字符串,如下列:正則表達式匹配函數名和Python中

"func(arg1, arg2, arg3, arg4, ..., argn)" 

編輯:此功能無法在一些特定的語言。它只是有這種格式。如果它更容易,不要認爲它是一個函數調用,只是一個字符串。

我想寫一個正則表達式來匹配函數和每個的參數。我正在用Python寫這個。這樣做的期望輸出是:

{"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]} 

編輯:儘管爭論可能是函數調用,我可以很容易地遞歸地嘗試用相同的正則表達式匹配他們一次我創建一個工程。通過這個我的意思是我可以在每個參數上對函數進行遞歸。但這不是真的有關。我是而不是試圖創建一個解釋器,只是用來識別參數。

這是我在這樣的嘗試:

import re 
s = "func(arg1, arg2, arg3, arg4, argn)" 
m = re.match(r"(?P<function>\w+)\s?\((?P<args>(?P<arg>\w+(,\s?)?)+)\)", s) 
print m.groupdict() 

這裏是輸出:

{'function': 'func', 'args': 'arg1, arg2, arg3, arg4, argn', 'arg': 'argn'} 

匹配功能就好了,所以做的參數設置。但是,我似乎無法匹配個別論點。這是我的正則表達式的問題,還是Python正則表達式匹配的限制?

EDIT2:我知道,我現在就可以使用下面的代碼分裂的論點:

d["arg"] = d["args"].split(", ") 

但我在想,如果我可以用正則表達式完成整個工作。特別是,我想知道爲什麼「arg」僅與最後一個參數相匹配。 (1)希望弄清楚爲什麼Python每次只匹配最後一個參數,(2)我是否可以在Python中進行Scheme風格的模式匹配。或者,如果在Python中有與Scheme-style模式匹配一​​樣直觀的東西。我查看了ast模塊,其語法非常複雜。

+1

這個函數調用某種特定的語言嗎?你不應該使用正則表達式來解析已經存在正確/完整解析器的語言...... – Borealid 2012-04-15 17:04:49

+0

你不能用正則表達式來做到這一點(假設你想匹配單個參數,它們本身可能是函數調用)。你需要一個實際的解析器。如果你堅持寫你自己的,然後閱讀:http://effbot.org/zone/simple-iterator-parser.htm – Wes 2012-04-15 17:12:13

+0

你可能想簽出[pyparsing](http://pyparsing.wikispaces.com/ )如果你打算做更復雜的事情。 – 2012-04-15 17:20:27

回答

4

看起來像你90%在那裏,爲什麼不直接交換argargs分組和做到:

import re 

fn_match = re.match(r"(?P<function>\w+)\s?\((?P<arg>(?P<args>\w+(,\s?)?)+)\)", s) 
fn_dict = fn_match.groupdict() 
del fn_dict['args'] 
fn_dict['arg'] = [arg.strip() for arg in fn_dict['arg'].split(',')] 
+0

我試圖捕獲整個事情作爲正則表達式。這不可能嗎? – BlackSheep 2012-04-15 19:13:50

+0

不要得到所需的參數列表。爲什麼只有瑞士軍刀,當你有一個整體工具箱? – mVChr 2012-04-15 21:40:27

7

正則表達式無法分析複雜的編程語言。

如果你只是想解析Python,我建議看看ast模塊,它會爲你解析它。

+0

我不想解析Python,只是捕獲一個非常特定的語法。從我閱讀的小部分來看,似乎ast模塊是(1)專用於Python的,(2)對於我正在嘗試做的事情來說非常複雜。 – BlackSheep 2012-04-15 19:35:38

1

要回答你的問題的最後一部分:第Python沒有類似的東西Scheme的「匹配」,也沒有像ML/Haskell那樣的模式匹配。它最接近的是解構這樣的事情

>>> (a, [b, c, (d, e)]) = (1, [9, 4, (45, 8)]) 
>>> e 
8 

並提取列表的頭和尾(在Python 3.X)這樣的能力...

>>> head, *tail = [1,2,3,4,5] 
>>> tail 
[2, 3, 4, 5] 

雖然有一些模塊在python中進行實模式匹配,但我無法保證它們的質量。

如果我必須這樣做,我會實現它有點不同 - 也許有能力輸入一個類型和可選參數(如長度或確切的內容)和一個函數來調用,如果它匹配匹配([list,length = 3,check =(3,str),func])並且匹配(list _ _ somestr)並且在範圍內調用func和somestr,還可以添加更多模式。