2012-03-10 68 views
0

這裏有蟒蛇一些簡單的函數調用:的Python:拆分的功能和參數

 
foo(arg1, arg2, arg3) 
func1() 

假定它是一個有效的函數調用。

假設我在解析文件時讀取了這些行。

將函數名和參數分隔成兩個元素的列表,第一個是函數名稱的字符串,第二個是參數的字符串,最簡潔的方法是什麼?

期望的結果:

 
["foo", "arg, arg2, arg3"] 
["func1", ""] 
我目前使用的字符串

搜索找到的「(」從左側的第一個實例「),」從右側,只是剪接一審與那些給定指數的字符串,但我不喜歡我接近這個問題。

回答

2

我目前正在做類似的使用正則表達式。根據您的情況調整我的代碼,以下內容適用於您提供的示例。

import re 

def explode(s): 
    pattern = r'(\w[\w\d_]*)\((.*)\)$' 
    match = re.match(pattern, s) 
    if match: 
     return list(match.groups()) 
    else: 
     return [] 
+0

很酷,它也處理嵌套括號的輸入。它如何做括號匹配? – MxyL 2012-03-10 08:54:47

+2

它沒有。這相當於您當前的實現,因爲它只是選擇了最後一個括號。 – Amber 2012-03-10 08:56:00

+0

哦,哈哈我明白了。 – MxyL 2012-03-10 08:57:43

2

如果您使用Python解析Python文件,請考慮使用Python的解析器:ast(具體爲ast.parse()調用)。

也就是說,你目前的方法並不可怕(儘管它會在函數調用中斷開多行垃圾郵件)。在上述完整解析器的基礎上,幾乎沒有完全正確的方法 - 例如,您可以計算匹配的parens,這樣即使中間出現換行符,a((b,c))也會返回正確的值 - 但那時代碼可能會出錯當遇到a((b, "c)")),等等。

+0

感謝您的建議。雖然,它實際上並不是一個python文件;我想不出一個簡單的方法來描述問題。這是一個通用的問題,處理「名稱(值)」形式的字符串,您有興趣將名稱與值分開。 – MxyL 2012-03-10 08:45:59

+2

然後我想這取決於 - 你的值是否允許像括號中的字符串一樣的東西?如果他們不這樣做,那麼問題就簡單多了,但如果他們這樣做了,你就必須跟蹤狀態,並且有效地重新編寫與語言使用相同的解析邏輯。 – Amber 2012-03-10 08:47:23

+0

它看起來不像我所期望的任何輸入都包含圓括號,除非用戶故意選擇錯誤的輸入。在那種情況下,我可以吼他們沒有遵循格式。 – MxyL 2012-03-10 08:50:24