用Python替换字符串的某些部分

时间:2010-09-13 02:38:26

标签: python string

我有一个SQL字符串,例如

SELECT * FROM benchmark WHERE xversion = 1.0

实际上,xversion是别名变量,而self.alias具有所有别名信息,如

{'CompilationParameters_Family': 'chip_name', 
 'xversion': 'CompilationParameters_XilinxVersion', 'opt_param':  
  ....
 'chip_name': 'CompilationParameters_Family', 
 'CompilationParameters_Device': 'device'}

使用此别名,我应该将字符串更改为如下。

SELECT * FROM benchmark WHERE CompilationParameters_XilinxVersion = 1.0

对于这一变化,我想出了以下内容。

def processAliasString(self, sqlString):
    components = sqlString.split(' ')
    resList = []
    for comp in components:
        if comp in self.alias:
            resList.append(self.alias[comp])
        else:
            resList.append(comp)
    resString = " ".join(resList)
    return resString

但是,我希望更好的代码不使用for循环。你觉得怎么样?

2 个答案:

答案 0 :(得分:1)

这应该这样做:

def processAliasString(self, sqlString):
    return ' '.join(self.alias.get(comp, comp) for comp in sqlString.split(' '))

答案 1 :(得分:1)

如果您可以更改输入字符串的格式,以使替换更清晰可见,例如

s = 'SELECT * FROM benchmark WHERE %(xversion)s = 1.0'

然后s % self.alias就足够了(根据您最喜欢的格式化语法和Python级别,还有其他一些替代方案可用)。

如果输入字符串格式为“nailed down”,re可以提供帮助,因为它提供了识别字边界的便利性(因此,如果缺少其他无关紧要的空间,您将不会意外错过替换)例如在xversion之后。考虑(s具有其原始形式,并且可替代地随意地与不可替代的混合):

import re
sre = re.compile('|'.join(r'\b%s\b' % re.escape(s) for s in self.alias))
def repl(mo):
    return self.alias[mo.group()]
news = sre.sub(repl, s)

这些方法很快,因为% - 格式化和re s'sub非常适合此类任务。