Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正则表达式Python—我想编写正则表达式,通过它可以将{expression}替换为{%print expression%}_Python_Regex - Fatal编程技术网

正则表达式Python—我想编写正则表达式,通过它可以将{expression}替换为{%print expression%}

正则表达式Python—我想编写正则表达式,通过它可以将{expression}替换为{%print expression%},python,regex,Python,Regex,我想用Python编写一个正则表达式,如果字符串中出现{{expression},它会将字符串更改为{%print expression%}类似的格式 {{ a+b }} to {% print a+b %} 或 但如果它包含如下变量,则不会更改: {{ var }} or {{ var.attr }} 我试过这个: pattern = re.compile( r'{{(?=(?:(?!{{)(?!\w([.]\w)*).*([()][+-/*%]\w)*)*}})') temp_

我想用Python编写一个正则表达式,如果字符串中出现
{{expression}
,它会将字符串更改为
{%print expression%}
类似的格式

{{ a+b }} 

to 

{% print a+b %}

但如果它包含如下变量,则不会更改:

{{ var }} or {{ var.attr }}
我试过这个:

pattern = re.compile( r'{{(?=(?:(?!{{)(?!\w([.]\w)*).*([()][+-/*%]\w)*)*}})')

temp_str = pattern.sub('{% print ', "{{ a }} {{ func() }} {{var.func()}} {{ a+ab+b*+2/100 }} {{ var.atr }} ")
它输出:

'{% print  a }} {% print  func() }} {{ var.func()}} {% print a+ab+b*+2/100 }} {% print  var.atr }}'
注意:关于右大括号`},我必须工作

我期望的结果是:

'{{  a }} {% print  func() }} {% print var.func()}} {% print a+ab+b*+2/100 }} {{ var.atr }}'

您可以使用
re.sub
方法中的函数捕获所有
{{}
标记,然后分别处理每个标记:

import re
data = "{{ a }} {{ func() }} {{var.func()}} {{ a+ab+b*+2/100 }} {{ var.atr}} "

def substitute(val):
    content = val.group(1)
    if re.match('^[\w\.]+$', content):
        return "{{ %s }}" % content
    else:
        return "{%% print %s %%}" % content
    pass

print re.sub("{{\s*(.*?)\s*}}", substitute, data)

“表达式”中允许哪些字符?根据您是否需要在表达式内部处理(转义)括号,正则表达式可能不是处理此问题的最佳方法。@Mooimaduck我对我尝试的内容进行了编辑。您尝试了
temp_str=pattern.sub({%print',“{{a}}{{func()}{var.func()}{a+ab+b*+2/100}{var.atr}}”)
,这将输出:{%print a%}{%print func()%}{%print var.func()%}{%print a+ab+b*+2/100%}{%print var.atr%}但我不想更改{{var}}或{a}或{var.atr}。谢谢@mariusjamrothanks@Mariusz jamrowh如果我只想将{{{{{}var}转换为{%print%},只有在有函数的情况下才需要正则表达式)内部。即使在{{}内有一个具有函数的字符串,也不要将其转换。例如,我们只想将{{functinion()}或{object.function()}转换为{%print function()%}或{%print object。function()%}不转换{{“string”},像{a+b}或{“a+b}或{“string”}中的{“functions()}之类的算术运算{{var | filters}}请在我上一篇评论中给我一些帮助。如果你问一个新问题,别人会更容易回答你的问题
import re
data = "{{ a }} {{ func() }} {{var.func()}} {{ a+ab+b*+2/100 }} {{ var.atr}} "

def substitute(val):
    content = val.group(1)
    if re.match('^[\w\.]+$', content):
        return "{{ %s }}" % content
    else:
        return "{%% print %s %%}" % content
    pass

print re.sub("{{\s*(.*?)\s*}}", substitute, data)