2016-04-08 12 views
0

私は別の辞書でJSONファイルで次のようなJSON辞書のすべての出現を置き換えるためにしようとしています:Pythonを使用してjsonファイル内のjsonディクショナリをすべて検索して置き換えるにはどうすればいいですか?

辞書を交換する

{ 
    "AP": { 
      "UFD": xxx, 
      "DF": "xxxxxx" 
     }, 
    "IE": xxxx, 
    "$": "PDAE" 
} 

{ 
    "FileNameModifierItemPosition": 1, 
    "FileNameModifierItemType": 0, 
    "FileNameModifierParameters": { 
            "DateParameters": { 
                 "DT": 0, 
                 "UFD": true, 
                 "DF": "yyyyMMdd" 
                }, 
            "FqlParameters": { 
                 "FExpression": null 
                } 
           }, 
    "IE": true, 
    "$": "PDMFN 
} 

と交換する辞書が、置き換えられる辞書を解析し、IE、UFD、DFの値を抽出し、第2辞書の対応するフィールドに割り当てることができるようにしたい。正規表現を使用してPythonでこれをどのように達成できますか?

+0

最初の辞書はすでにあなたが望むそれらのフィールドの有効なデータが含まれています。私はあなたがあなたがそれらを '抽出'したいと言っているときにあなたが何を意味するかは分かりません。値を新しい辞書のフィールドに代入するだけで、 'd2 ['UF'] = d1 ['UF']'の行に沿って値を割り当てることができます。正規表現はどこに入ってきますか? –

+1

あなたの例から、第1辞書と第2辞書の間の対応するフィールドは明確ではありません。 '' FqlParameters''、 '' DateParameters''、 '' FileNameModifierItemPosition''などは新しいのですか? – Quinn

+0

最初の辞書が深いネストされたjsonに入れ子になっているので、もう1つの辞書との文字列一致を使って最初の辞書のすべての部分を置き換えたいと思っています。 – AnkitSablok

答えて

1

EDITこの方法を試してください:

import re 
# pattern to get values of UFD, DF, and IE from dict1 
p1 = '(?s){\s+"AP":\s+{\s+"UFD":\s+(.*?),\s+"DF":\s+"(.*?)"\s+},\s+"IE":\s+(.*?),\s+"\$":\s+"PDAE"\s+}' 
# pattern to match dict2 
p2 = '({[\s\S]+?"UFD":\s+)(.*?)(,\s+"DF":\s+")(.*?)("[\s\S]+?"IE":\s+)(.*?)(,[\s\S]+?})' 

dict1 = """ 
{ 
    "AP": { 
      "UFD": xxx, 
      "DF": "xxxxxx" 
     }, 
    "IE": xxxx, 
    "$": "PDAE" 
} 
""" 

dict2 = """ 
{ 
    "FileNameModifierItemPosition": 1, 
    "FileNameModifierItemType": 0, 
    "FileNameModifierParameters": { 
            "DateParameters": { 
                 "DT": 0, 
                 "UFD": true, 
                 "DF": "yyyyMMdd" 
                }, 
            "FqlParameters": { 
                 "FExpression": null 
                } 
           }, 
    "IE": true, 
    "$": "PDMFN 
} 
""" 
# retrieve values from dict1 
dict1_values = re.findall(p1, dict1)[0] 
# replace dict2 with corressponding values from dict1 
print re.sub(p2, r'\1%s\3%s\5%s\7' % dict1_values, dict2) 

出力:

{ 
    "FileNameModifierItemPosition": 1, 
    "FileNameModifierItemType": 0, 
    "FileNameModifierParameters": { 
            "DateParameters": { 
                 "DT": 0, 
                 "UFD": xxx, 
                 "DF": "xxxxxx" 
                }, 
            "FqlParameters": { 
                 "FExpression": null 
                } 
           }, 
    "IE": xxxx, 
    "$": "PDMFN 
} 
+0

xxxxのような個々のキー値の値を考慮しないと思う。 – AnkitSablok

+0

これがあなたが探しているものかどうか不明です。 [正規表現のデモ](https://regex101.com/r/hO2tK5/3) – Quinn

+0

あなたは私の救い主です、このような良い答えのためにたくさんありがとうございました。しかし、私は少し異なるアプローチを使って異なる値を持つパターン。とにかく、ありがとう – AnkitSablok

関連する問題