これは @moliware のソリューションに似ていますが、このソリューションではキーのハードコーディングは必要ありません。
import re
class mydict(dict):
def __missing__(self, key):
self.setdefault(key, '')
return ''
def solve(a, b):
dic = mydict()
a % dic
strs = a
for x in dic:
esc = re.escape(x)
strs = re.sub(r'(%\({}\).)'.format(esc), '(?P<{}>.*)'.format(esc), strs)
return re.search(strs, b).groupdict()
if __name__ == '__main__':
a = '/stock/%(symbol)s/%(property)s'
b = '/stock/AAPL/price'
print solve(a, b)
a = "Foo %(bar)s spam %(eggs)s %(python)s"
b = 'Foo BAR spam 10 3.x'
print solve(a, b)
出力:
{'symbol': 'AAPL', 'property': 'price'}
{'python': '3.x', 'eggs': '10', 'bar': 'BAR'}
@torekがあいまいな出力(キー間にスペースがない)の場合を指摘したように、ここでは答えが間違っている可能性があります。
たとえば。
a = 'leading/%(A)s%(B)s/trailing'
b = 'leading/helloworld/trailing'
ここで見るだけでは、またはb
のどちらかの実際の値を判断するのは困難です。A
B