2016-10-28 24 views
2

私はPythonスクリプトでの経験はありませんが、私のプロジェクトの要件としてコードを作成しなければならなかったのですが、ここで問題が発生しています -python - キーの値を同じ辞書の異なるキーに対応する値に置き換えます

私はPythonで読むためにきた共通のパスを設定するには、UNIXスクリプトから来て、以下の値を持つ辞書持っている -

{'# blah blah blah ': '', 'START_DIR': '/PATH/TO/StartDir', 'FIRST_DIR': '${START_DIR}/FirstDir', '# GIBBERISH': 'MORE GIBBERISH', 'SECOND_DIR': '${FIRST_DIR}/SecondDir'....so on and so forth} 

を私は値を読み取ることができたが、値は次のようになります -

FIRST_DIR="${START_DIR}/FirstDir" 
SECOND_DIR="${FIRST_DIR}/SecondDir" 
..... 
Pythonで読みながら、UNIXの変数として

は展開されませんし、私は以下のように辞書の値ですべての$ {}囲まれた変数のための辞書内の値を置き換えたい -

{'# blah blah blah ': '', 'START_DIR': '/PATH/TO/StartDir', 'FIRST_DIR': '/PATH/TO/StartDir/FirstDir', '# GIBBERISH': 'MORE GIBBERISH', 'SECOND_DIR': '/PATH/TO/StartDir/FirstDir/SecondDir'....so on and so forth} 

私が検索しましたこのフォーラムと私が得た最も近い答えはこのリンクに見つかりました - https://codereview.stackexchange.com/questions/80273/replace-keys-in-values-with-key-values-from-same-dictionary しかし私は私の問題のために働くことができませんでした。あなたの誰かが私を助けてくれますか?

ありがとうございました!

答えて

3

re.searchを使用して、UNIXスタイルの変数を見つけることができます。一致するものが見つかった場合は、その変数を辞書の変数に置き換えます。 whileループは、これらの変数がより多くの変数などを持つ変数を参照できるためです。すべての変数が展開されるまで続けます。

import re 
def convert_dict(d): 
    while any(re.search('\${(.*)}', i) for i in d.values()): 
     for key, value in d.items(): 
      match = re.search('\${(.*)}', value) 
      if match: 
       d[key] = value.replace(match.group(0), d[match.group(1)]) 

出力

>>> d = {'FIRST_DIR': '${START_DIR}/FirstDir', 
     '# GIBBERISH': 'MORE GIBBERISH', 
     '# blah blah blah ': '', 
     'SECOND_DIR': '${FIRST_DIR}/SecondDir', 
     'START_DIR': '/PATH/TO/StartDir'} 
>>> convert_dict(d) 
{'FIRST_DIR': '/PATH/TO/StartDir/FirstDir', 
'START_DIR': '/PATH/TO/StartDir', 
'# blah blah blah ': '', 
'# GIBBERISH': 'MORE GIBBERISH', 
'SECOND_DIR': '/PATH/TO/StartDir/FirstDir/SecondDir'} 
+0

おかげトンコーリー!!それは完璧にうまくいった。しかし、何が起こっているのかを説明してください - 'd [key] = value.replace(match.group(0)、d [match.group(1)])?'私はこの置き換えを理解できません。 –

関連する問題