【问题标题】:Replacing some part of string with Python用 Python 替换部分字符串
【发布时间】:2010-09-13 02:38:26
【问题描述】:

我有一个 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':'设备'}

使用这个别名,我应该把字符串改成如下。

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 循环。你怎么看?

【问题讨论】:

  • 我可以看到您的代码中的一个潜在弱点。想想如果self.alias 像这样说会发生什么:{'SELECT': 'DROP', '*': 'TABLE', 'FROM': '', 'WHERE': ';--' }

标签: python string


【解决方案1】:

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

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

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

如果输入字符串格式被“确定”,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)

这些方法很快,因为 %-formatting 和 res' sub 非常适合此类任务。

【讨论】:

  • 感谢您的精彩提示。不幸的是,用户给了我 SQL 命令,所以要使用你的代码,我应该解析确切知道应该修改字符串的哪一部分,这现在几乎是不可能的。
  • @prosseek,但是,您可以在我的答案的第二部分中使用基于re 的代码(没有丢失无关紧要的空格的风险,就像使用基于.split() 的方法一样)。
【解决方案2】:

应该这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-17
    • 2018-01-22
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 2012-07-17
    相关资源
    最近更新 更多