Regex exclude string and attribute in expression

I have a regular expression that converts {{ expression }}to {% print expression %}when the expression is {{ function() }}or {{ object.function() }}or an arithmetic operation, for example {{ a+b }}, but will not convert when it receives {{ var }}or {{ object.attribute }}.

The problem with a regular expression, I is to convert a string expression {{ "string" }}or {{ "function()" }}or {{ "{{ var}}" }}in {% print "string" %}or {% print "function()" %}or{% 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))

Output:

'{{var}} {{object.var}} {% print func ()%} {% print object.function ()%} {% print a + b%} {% print "string"%} {% print "{{var}}"%} {% print "function ()"%} {% print "a + b"%} '

The output I want is:

'{{var}} {{object.var}} {% print func()%} {% print object.function()%} {% print a + b%} {{ "string" }} {{ "{{var}}" }} {{ "function()" }} {{ "a + b" }} '

: - {{ }} , {{ "string" }}, .. {{ 'string' }}, .

+4
1

. .

import re

def replacement(val):
    content = val.group(1).strip()
    if re.match('^\w[^\.\(\+\*\/\-\|]*\.?\w[^\.\(\+\*\/\-\|]*$', content):
        return "{{ %s }}" % content
    else:
        return "{%% print %s %%}" % content

def maskString(templateString):
    stringChars = ['"', "'"]
    a = 0
    start = None
    maskedList = []
    while a < len(templateString):
        l = templateString[a]
        if l in stringChars and start is None and a-1 >=0 and templateString[a-1] != '\\':
            start = {'l' : l, 's' : a}
        elif start is not None and l is start['l'] and a-1 >=0 and templateString[a-1] != '\\':
            start['e'] = a + 1
            stringToMask = templateString[start['s']:start['e']]
            templateString = templateString[:start['s']] + ("_" * len(stringToMask)) + templateString[start['e']:]
            maskedList.append(stringToMask)
            start = None
        a += 1
    return (templateString, maskedList)

def unmaskString(templateString, maskedList):
    for string in maskedList:
        templateString = templateString.replace("_" * len(string), string,1)
    return templateString

def templateMatcher(templateString):
    p = re.compile('("[^"]*)"')
    templateString, maskedList = maskString(templateString)
    templateString = re.sub("{{(\s*.*?\s*)}}", replacement, templateString)
    return unmaskString(templateString, maskedList)

string_obj = """{{ var }} {{ object.var }} {{ func()}} {{ object.function() }} {{ a+b }} {{ "string" }} {{ "{{ var }}" }} {{ "function()" }} {{ "a+b" }}"""
string_obj_2 = """{{ a+b*c-d/100}} {{ 1 * 2 }} {{ 20/10 }} {{ 5-4 }}"""
string_obj_3 = """{{ "another {{ mask" }} {{ func() }}, {{ a+b }} , {{ "string with \\""|filter }}"""

print(templateMatcher(string_obj))
print(templateMatcher(string_obj_2))
print(templateMatcher(string_obj_3))

​​ , "\"" '"' , , _. stringChars. , ', .

{{ var }} {{ object.var }} {% print func() %} {% print object.function() %} {% print a+b %} {{ "string" }} {{ "{{ var }}" }} {{ "function()" }} {{ "a+b" }}
{% print a+b*c-d/100 %} {% print 1 * 2 %} {% print 20/10 %} {% print 5-4 %}
{{ "another {{ mask" }} {% print func() %}, {% print a+b %} , {% print "string with \""|filter %}
+1

All Articles