短縮版:
正規表現内のすべての名前付きグループをdatadictからの対応するデータに置き換える関数を作成したいと思います。例えば:
Input: expr=r"/(?P<something>\w+)/whatever/(?P<something2>\w+)" data={"something":123, "something2": "thing"}
Output: "/123/whatever/thing"
しかし、私はそれを行う方法がわかりません。
いくつかの追加情報:
名前とパターンを含み、re.searchを使用しようとしているタプルのトラフリストを反復するコードがあります。re.searchが指定された文字列と一致する場合、現在のタプルとgroupdict()(re.searchからのデータを含むdict)から名前を返します。
これがコードです
class UrlResolver():
def __init__(self):
    self.urls = {}
def parse(self, app, url):
    for pattern in self.urls[app]:
        data = re.search(pattern[1], url)
        if data:
            return {"name": pattern[0], "data": data.groupdict()}
今、私は関数を作成したいと思います:
def compose(self, app, name, data):
    for pattern in self.url[app]:
        if pattern[0] == name:
            return string composed from regex expression and data from data dict.
上記の関数は、すべての名前付きグループをdatadictからの対応するデータに置き換える必要があります。
解決
Hans Then(Thanks!)から提供された回答と、ここにある他の情報を使用すると、解決策が得られます。
    def _group_replacer(data, match):
        data_key = match.group(1)
        return data[data_key]
    expression = r"\([^\(]*<([^<]*)>[^\(]*\)"
    expression = re.compile(expression)
    reversed = re.sub(expression, partial(_group_replacer, data), string)
関数「部分」はfunctoolsからインポートできます