短縮版:
正規表現内のすべての名前付きグループを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からインポートできます