正则表达式需要在python中进行变量扩展

时间:2013-02-08 05:23:13

标签: python regex

我有一个像这样的值的变量

var = '${home_${path}}'

我想要一个递归检测${ any content }的正则表达式。也就是说,首先我应该匹配${home_${path}}然后匹配${path}。我需要通过将$ {..}替换为实际内容来评估变量内容。

1 个答案:

答案 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')