用Python替换字符串的某些部分
例如,我有一个SQL字符串用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
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)