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

用Python替换字符串的某些部分,python,string,Python,String,例如,我有一个SQL字符串 SELECT * FROM benchmark WHERE xversion = 1.0 实际上,xversion是一个别名变量,self.alias包含了所有别名信息 {'CompilationParameters_Family': 'chip_name', 'xversion': 'CompilationParameters_XilinxVersion', 'opt_param': .... 'chip_name': 'CompilationPar

例如,我有一个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'} 对于这一变化,我提出了以下建议

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循环。你觉得怎么样?

这应该可以:

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

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

s = 'SELECT * FROM benchmark WHERE %(xversion)s = 1.0'
然后
s%self.alias
就足够了(根据您最喜欢的格式语法和Python级别,还有一些其他选项可用)

如果输入字符串格式是“固定”的,
re
可以提供帮助,因为它提供了识别单词边界的便利(因此,如果在其他方面不重要的空格丢失,例如
xversion
之后,您不会意外地错过替换)。考虑(<<代码> S/<代码>具有其原始形式,可替换的与不可替代的混合混合):


这些方法速度很快,因为
%
-格式化和
re
s'
sub
对于此类任务非常优化。

我可以看出您代码中的一个潜在弱点。想想如果self.alias是这样的话会发生什么:
{'SELECT':'DROP','*':'TABLE','FROM':'','WHERE':';-->
。谢谢你的精彩提示。不幸的是,用户给了我SQL命令,所以要使用您的代码,我应该解析以准确知道字符串的哪一部分应该被修改,这现在几乎是不可能的。@prosseek,但是,您可以在我的答案的第二部分中使用基于
re
的代码(如采用基于
.split()。
s = 'SELECT * FROM benchmark WHERE %(xversion)s = 1.0'
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)