我有一个像这样的值的变量
var = '${home_${path}}'
我想要一个递归检测${ any content }
的正则表达式。也就是说,首先我应该匹配${home_${path}}
然后匹配${path}
。我需要通过将$ {..}替换为实际内容来评估变量内容。
答案 0 :(得分:1)
我认为你需要一个常规函数而不是正则表达式。问题是纯正则表达式不能匹配任意嵌套的递归模式。因此,它们不适用于赛道匹配开启器和闭门器。
相反,编写一个函数来对跟踪LIFO堆栈中的开启者的输入字符串进行传递(只需附加到常规python列表),然后在找到它们时匹配闭包器(弹出最近的相应开启者):
import re
braces = re.compile(r'(\${)|(})')
def substitute(s, **env):
openers = []
pos = 0
while 1:
mo = braces.search(s, pos)
if mo is None:
break
opener, closer = mo.groups()
if opener:
openers.append(mo.start())
pos = mo.end() + 1
continue
start = openers.pop()
end = mo.end()
body = s[start+2 : end-1]
s = s[:start] + env[body] + s[end:]
return s
print substitute('Return to ${home_${path}} for further ${action}',
home_world='earth',
home_state='kansas',
path='state',
action='orders')