【发布时间】:2016-03-09 06:53:14
【问题描述】:
我有一个正则表达式,当表达式为{{ function() }} 或{{ object.function() }} 或像{{ a+b }} 这样的算术运算时,它会将{{ expression }} 转换为{% print expression %},但当它得到{{ var }} 或{{ object.attribute }} 时不会转换。
我遇到的正则表达式的问题是将字符串表达式{{ "string" }} 或{{ "function()" }} 或{{ "{{ var}}" }} 转换为{% print "string" %} 或{% print "function()" %} 或{% print "{% print var %}" %}
import re
def replacement(val):
content = val.group(1)
if re.match('^\s*[\w\.]+\s*$', content):
return "{{%s}}" % content
else:
return "{%% print %s %%}" % content
string_obj = """{{ var }} {{ object.var }} {{ func()}} {{ object.function() }} {{ a+b }} {{ "string" }} {{ "{{ var }}" }} {{ "function()" }} {{ "a+b" }}"""
print(re.sub("{{(\s*.*?\s*)}}", replacement, string_obj))
输出:
'{{ var }} {{ object.var }} {%print func()%} {% print object.function() %} {% print a+b %} {% print "string" %} {% print "{{ var }}" %} {% print "function()" %} {% print "a+b" %}'
我想要的输出是:
'{{ var }} {{ object.var }} {%print func()%} {% print object.function() %} {% print a+b %} {{ "string" }} {{ "{{ var }}" }} {{ "function()" }} {{ "a+b" }}'
注意:这里的一个条件是{{ }}之间的表达式可以有字符串表达式,如{{ "string" }},即带双引号或{{ 'string' }},即带单引号。
【问题讨论】:
-
大概是因为您在角色组中使用了
\w。您可以使用\"在此处添加双引号,或者不使用正则表达式并测试"()"是否在val.group(1)中(以及其他类似+-*/的内容)。 -
我不能只检查“()”这个因为我想转换算术表达式也像 {{ a+b }} 如果我要检查“()”它也会转换表达式像 {{ "function()" }}。我只想转换 {{ function () }} 或 {{ a+b }} 而不是像 {{ "function()" }} {{ "a + b" }} 这样的表达式
-
也许最直接的方法是为包围(双)引号或包围双括号添加大小写。或者找一个模板转换器,它已经可以做你想做的事情。
标签: python regex string algorithm