Замена некоторой части строки на Python - PullRequest
0 голосов
/ 13 сентября 2010

У меня есть строка 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 ]

1 голос
/ 13 сентября 2010

Если бы вы могли изменить формат входной строки, чтобы сделать замены более четкими, например,

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)

Эти подходы быстрые, поскольку % -форматирование и re s 'sub действительно хорошо оптимизированы для таких задач.

1 голос
/ 13 сентября 2010

Это должно сделать это:

def processAliasString(self, sqlString):
    return ' '.join(self.alias.get(comp, comp) for comp in sqlString.split(' '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...