1

私はこのような文字列を持っていsymbolますproperty

a = '/stock/%(symbol)s/%(property)s'

私はこのような別の文字列を持っていAAPLますprice

b = '/stock/AAPL/price'

私はこのような口述を生成しようとしています:

c = {
    'symbol': 'AAPL',
    'property': 'price'
}

文字列の書式設定を使用すると、次のことができます。

> a % c == b
True

しかし、私は別の方向に行こうとしています。正規表現マジックの時間ですか?

4

3 に答える 3

4

正規表現を使用したソリューション:

>>> import re
>>> b = '/stock/AAPL/price'
>>> result = re.match('/.*?/(?P<symbol>.*?)/(?P<property>.*)', b)
>>> result.groupdict()
{'symbol': 'AAPL', 'property': 'price'}

正規表現をもう少し調整できますが、本質的にはこれがアイデアです。

于 2013-08-21T16:32:11.633 に答える
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のどちらかの実際の値を判断するのは困難です。AB

于 2013-08-21T17:09:23.953 に答える
2

行儀の良い入力を想定すると、文字列を分割して dict に圧縮することができます

keys = ('symbol', 'property')
b = '/stock/AAPL/price'
dict(zip(keys, b.split('/')[2:4]))
于 2013-08-21T16:58:11.347 に答える