2010-06-14 97 views
2

初學者在這裏!提前原諒我提出可能是一個非常簡單的問題。請幫我優化我的Python代碼

我一直在試圖放在一起,在指定的純文本文件上運行多個查找和替換操作和一些類似的東西的Python腳本。它工作,但從編程的角度來看,我懷疑它運作良好。我如何最好地去優化對'outtext'變量所做的操作?目前,它基本上是做一個非常類似的事情了四倍...

import binascii 
import re 
import struct 
import sys 

infile = sys.argv[1] 
charenc = sys.argv[2] 
outFile=infile+'.tex' 

findreplace = [ 
('TERM1', 'TERM2'), 
('TERM3', 'TERM4'), 
('TERM5', 'TERM6'), 
] 

inF = open(infile,'rb') 
s=unicode(inF.read(),charenc) 
inF.close() 

# THIS IS VERY MESSY. 
for couple in findreplace: 
    outtext=s.replace(couple[0],couple[1]) 
    s=outtext 

for couple in findreplace: 
    outtext=re.compile('Title: (.*)', re.I).sub(r'\\title'+ r'{\1}', s) 
    s=outtext 

for couple in findreplace: 
    outtext=re.compile('Author: (.*)', re.I).sub(r'\\author'+ r'{\1}', s) 
    s=outtext 

for couple in findreplace: 
    outtext=re.compile('Date: (.*)', re.I).sub(r'\\date'+ r'{\1}', s) 
    s=outtext 
# END MESSY SECTION. 

outF = open(outFile,'wb') 
outF.write(outtext.encode('utf-8')) 
outF.close() 
+0

謝謝大家的幫助!我已經把它切好了! – 2010-06-14 12:48:26

+0

[Python查找替換腳本中的正則表達式可能重複?更新](http://stackoverflow.com/questions/3036706/regular-expressions-in-a-python-find-and-replace-script-update) – SilentGhost 2010-06-14 13:31:47

+0

@SilentGhost,我認爲這是一個後續問題,而不是重複。 – 2010-06-14 19:44:28

回答

4

對於最後三個替換,for循環似乎是不必要的,因爲循環體不使用循環變量。也不需要將結果分配給臨時的outtext變量,它可以直接分配給s

這些變化使代碼更簡潔:

for couple in findreplace: 
    s = s.replace(couple[0],couple[1]) 

s = re.compile('Title: (.*)', re.I).sub(r'\\title {\1}', s) 
s = re.compile('Author: (.*)', re.I).sub(r'\\author {\1}', s) 
s = re.compile('Date: (.*)', re.I).sub(r'\\date {\1}', s) 
2

一些可能性:

  • 執行外循環re.compile。
  • 只使用一個循環,並在其中完成所有四件事。
  • 使用一個正則表達式,它與標題,作者或日期匹配。
  • 不要在循環內執行最後三個替換,因爲它們不使用couple變量。
+0

除了最後一個「使用一個正則表達式......」這個不好的建議之外,我會給你一個+1,正則表達式足夠複雜以便維護,而沒有理由更復雜。 – 2010-06-14 12:27:57

+0

但在這種情況下,這將是一個非常簡單的正則表達式,所以+1。 – 2010-06-14 12:30:01

0

你的代碼不是那麼糟糕。如果你想優化速度,那麼我會考慮在程序開始時編譯你的正則表達式。另外,如果你想整理你的代碼,然後把你所有的潛艇鏈接在一個循環中。