1

この形式のキー値を持つ長い文字列があります。

"info":"infotext","day":"today","12":"here","info":"infotext2","info":"infotext3"

すべての「情報」キーの値 (=情報テキスト) を取得したい。これはどのように行うことができますか?

4

4 に答える 4

4

json を使用してください、ルーク

s = '"info":"infotext","day":"today","12":"here","info":"infotext2","info":"infotext3"'

import json

def pairs_hook(pairs):
    return [val for key, val in pairs if key == 'info']

p = json.loads('{' + s + '}', object_pairs_hook=pairs_hook)
print p # [u'infotext', u'infotext2', u'infotext3']

ドキュメントから:

object_pairs_hook はオプションの関数で、ペアの順序付きリストでデコードされたオブジェクト リテラルの結果で呼び出されます。dict の代わりに object_pairs_hook の戻り値が使用されます。

完全を期すために、同じことを行う正規表現を次に示します。

rg = r'''(?x)

    "info"
    \s* : \s*
    "
        (
            (?:\\.|[^"])*
        )
    "
'''
re.findall(rg, s) # ['infotext', 'infotext2', 'infotext3']

:これは、次のように、文字列内のスペースとエスケープされた引用符も処理します。

 "info"  :   "some \"interesting\" information"
于 2012-11-17T19:41:17.300 に答える
3

(エスケープされた) 引用符が含まれていない限りinfotext、次のようなことを試すことができます。

>>> m = re.findall(r'"info":"([^"]+)', str)
>>> m
['infotext', 'infotext2', 'infotext3']

単純に一致させてから、可能な限り"info":"多くの非"文字 (キャプチャされて返される) を返します。

于 2012-11-17T19:37:54.303 に答える
0

この正規表現を使用します(?<="info":")(.+?)(?=")

于 2012-11-17T19:38:41.870 に答える
0
In [140]: import re

In [141]: strs='''"info":"infotext","day":"today","12":"here","info":"infotext2","info":"infotext3"'''

In [146]: [x.split(":")[-1].strip('"') for x in  re.findall(r'"info":"\w+"',strs)]
Out[146]: ['infotext', 'infotext2', 'infotext3']
于 2012-11-17T19:40:55.657 に答える