0

私はこのような値を持つ変数を持っています

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

${ any content }再帰的に検出する正規表現が必要です。つまり、最初に I が一致${home_${path}}し、次に${path}. ${..} を実際のコンテンツに置き換えて変数のコンテンツを評価するには、これが必要です。

4

1 に答える 1

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')
于 2013-02-08T05:30:12.857 に答える