2016-06-09 49 views
0

我想使用正則表達式和Python爲我的函數添加額外的參數。正則表達式在源代碼中爲php函數添加額外參數

我的功能看起來是這樣的:

mail(arg1, arg2, arg3, arg4); 

任何人都可以用正則表達式有助於得到這樣的結果:

mail(arg1, arg2, arg3, arg4, arg5); 

我有一個總體思路:

import os, fnmatch 

for path, dirs, files in os.walk(os.path.abspath('directory')): 
     for filename in fnmatch.filter(files, '*.php'): 
       filepath = os.path.join(path, filename) 

       with open(filepath) as php: 
         i = php.read() 
       i = i.sub(re, re, line) 
       with open(filepath,"w") as f: 
         f.write(i) 
+3

你實際上試圖解決什麼問題?重寫文件不太可能是這樣做的最好方式。 – jonrsharpe

+0

我不相信python是一種常規語言。我不認爲這個標籤意味着你認爲它的意思(但是,歡迎來到SO,並且對你的第一個問題格式化的問題!) –

+0

此外,正則表達式不能捕獲函數聲明(至少在python中,我不知道PHP,但我強烈懷疑類似)。你需要上下文無關的語法。我的主題非常隱約相關的答案:http://stackoverflow.com/questions/36802298/simple-tokenizer-for-c-in-python/36802496#36802496,我敢肯定有更好的適合SO –

回答

0

我想提出一個與你要求的不同的答案。

考慮一些其他的選擇。假設第5個參數總是相同的,還有其他一些方法。 (1)寫一個新的函數調用。我們稱之爲newmail

function newmail($arg1, $arg2, $arg3, $arg4) { 
    return mail($arg1, $arg2, $arg3, $arg4, "My constant 5th argument"); 
} 

現在改變所有mail()調用newmail()

(2)使你的第五個參數默認參數在現有mail()

以上(這也可以在溶液中進行(1) )

function mail($arg1, $arg2, $arg3, $arg4, $arg5 = "My constant 5th argument") { 
    [...] 
} 
+0

謝謝你。這非常簡單但有效。我很高興得到你的支持! –

0

假設你'不要做複雜的多行解析,並且你的參數不是帶有空格或c的表達式ommas,而且參數之間的空間是一致的,這裏是一個天真的正則表達式:

re.sub(r'(mail\(\S+, \S+, \S+)\);', '\\1, arg4);', src) 

您不妨圍繞\S+\s*\S+\s*,使環繞各參數的空白靈活性。

它也會捕獲可能被命名爲foomail的函數,因此您可能希望在表達式的開頭添加一個強制性空格(r' (mail...')。這不會趕上行的開始,所以你也需要(r'^(mail...'

解析和正則表達式匹配是兩個非常不同的學科。我知道有時候需要快速和骯髒的東西來改變一堆代碼行,所以我希望這有助於。

請務必先複印一份。

+0

林欣賞你的快速回復。我對Regex很陌生,但是我有一個很大的文件,郵件函數被一遍又一遍地調用(相同的格式:傳遞4個參數,用逗號分隔,但每個參數都有不同的內容)。我想添加一個固定的第五個參數。如果這對你有意義?請幫忙。謝謝! –

+0

如果你打算使用正則表達式,你的過程將會迭代。從我給你的東西開始,看看它失敗的地方,修改,調整和重複。 – rrauenza