正则表达式Python—我想编写正则表达式,通过它可以将{expression}替换为{%print expression%}
我想用Python编写一个正则表达式,如果字符串中出现正则表达式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_
{{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)