代码之家  ›  专栏  ›  技术社区  ›  prosseek

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

  •  0
  • prosseek  · 技术社区  · 14 年前

    SELECT * FROM benchmark WHERE xversion = 1.0
    

    实际上,xversion是一个别名变量自身别名所有的别名信息

    {'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 回复  |  直到 14 年前
        1
  •  1
  •   Alex Martelli    14 年前

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

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

    然后 s % self.alias

    如果输入字符串格式为“钉住”, 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)
    

    这些方法很快,因为 % -格式化和 重新 是的 sub

        2
  •  1
  •   Amber    14 年前

    这应该做到:

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