请帮我优化我的Python代码
初学者在这里!提前原谅我提出可能是一个非常简单的问题。请帮我优化我的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()
对于最后三个替换,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)
一些可能性:
- 执行外循环re.compile。
- 只使用一个循环,并在其中完成所有四件事。
- 使用一个正则表达式,它与标题,作者或日期匹配。
- 不要在循环内执行最后三个替换,因为它们不使用
couple
变量。
除了最后一个“使用一个正则表达式......”这个不好的建议之外,我会给你一个+1,正则表达式足够复杂以便维护,而没有理由更复杂。 – 2010-06-14 12:27:57
但在这种情况下,这将是一个非常简单的正则表达式,所以+1。 – 2010-06-14 12:30:01
你的代码不是那么糟糕。如果你想优化速度,那么我会考虑在程序开始时编译你的正则表达式。另外,如果你想整理你的代码,然后把你所有的潜艇链接在一个循环中。
谢谢大家的帮助!我已经把它切好了! – 2010-06-14 12:48:26
[Python查找替换脚本中的正则表达式可能重复?更新](http://*.com/questions/3036706/regular-expressions-in-a-python-find-and-replace-script-update) – SilentGhost 2010-06-14 13:31:47
@SilentGhost,我认为这是一个后续问题,而不是重复。 – 2010-06-14 19:44:28