この形式のキー値を持つ長い文字列があります。
"info":"infotext","day":"today","12":"here","info":"infotext2","info":"infotext3"
すべての「情報」キーの値 (=情報テキスト) を取得したい。これはどのように行うことができますか?
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"
(エスケープされた) 引用符が含まれていない限りinfotext
、次のようなことを試すことができます。
>>> m = re.findall(r'"info":"([^"]+)', str)
>>> m
['infotext', 'infotext2', 'infotext3']
単純に一致させてから、可能な限り"info":"
多くの非"
文字 (キャプチャされて返される) を返します。
この正規表現を使用します(?<="info":")(.+?)(?=")
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']