Моя цель здесь - создать очень простой язык шаблонов. В данный момент я работаю над заменой переменной значением, например так:
Этот вход:
Паутина
Должен выдать этот вывод:
Сеть Это тестовая переменная
У меня это работает. Но, глядя на мой код, я запускаю несколько одинаковых регулярных выражений в одних и тех же строках - это просто оскорбляет мое чувство эффективности. Должен быть лучший, более питонский способ. (Это два цикла while, которые действительно оскорбляют.)
Это проходит модульные тесты, так что, если это глупая преждевременная оптимизация, скажите мне - я хочу отпустить это. В документе могут быть десятки определений и использований переменных, но не сотни. Но я подозреваю, что есть очевидные (для других людей) способы улучшить это, и мне любопытно, что придумает толпа StackOverflow.
def stripMatchedQuotes(item):
MatchedSingleQuotes = re.compile(r"'(.*)'", re.LOCALE)
MatchedDoubleQuotes = re.compile(r'"(.*)"', re.LOCALE)
item = MatchedSingleQuotes.sub(r'\1', item, 1)
item = MatchedDoubleQuotes.sub(r'\1', item, 1)
return item
def processVariables(item):
VariableDefinition = re.compile(r'<%(.*?)=(.*?)%>', re.LOCALE)
VariableUse = re.compile(r'<%(.*?)%>', re.LOCALE)
Variables={}
while VariableDefinition.search(item):
VarName, VarDef = VariableDefinition.search(item).groups()
VarName = stripMatchedQuotes(VarName).upper().strip()
VarDef = stripMatchedQuotes(VarDef.strip())
Variables[VarName] = VarDef
item = VariableDefinition.sub('', item, 1)
while VariableUse.search(item):
VarName = stripMatchedQuotes(VariableUse.search(item).group(1).upper()).strip()
item = VariableUse.sub(Variables[VarName], item, 1)
return item