这类似于@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
。