我有一个这样的字符串,其中symbol
和property
各不相同:
a = '/stock/%(symbol)s/%(property)s'
我有另一个这样的字符串,其中AAPL
和price
各不相同:
b = '/stock/AAPL/price'
我正在尝试生成这样的字典:
c = {
'symbol': 'AAPL',
'property': 'price'
}
使用字符串格式化,我可以这样做:
> a % c == b
True
但我正试图走向另一个方向。一些正则表达式魔术的时间?
答案 0 :(得分:4)
具有正则表达式的解决方案:
>>> import re
>>> b = '/stock/AAPL/price'
>>> result = re.match('/.*?/(?P<symbol>.*?)/(?P<property>.*)', b)
>>> result.groupdict()
{'symbol': 'AAPL', 'property': 'price'}
你可以多调整一下正则表达式,但实质上,这就是这个想法。
答案 1 :(得分:2)
假设表现良好的输入,您可以将字符串拆分并将其压缩为字典
keys = ('symbol', 'property')
b = '/stock/AAPL/price'
dict(zip(keys, b.split('/')[2:4]))
答案 2 :(得分:2)
这类似于@ 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
的实际价值。