1

解析する行が何百もあります。彼らは次のようなものです:

key1 = $global.path
key2 = prefix +$global.name
key3 = prefix + $default
key4 = prefix+$lib.id + $value + $args.id + ' some between ' + $global.title

where$globalは Python で と呼ばれる特定の dict を表し'settings'ます。すべての用語 '$global.key' を dict value に置き換えたいと思いますsettings['key']$lib$argsは に似てい$globalます。

「.」がない場合のみ、次$defaultと同じである必要があります$global.default

そして、すべて'+', ' + ', '+ ', ' +'を直接削除する必要があります。

Pythonでこれを行う方法は? 私は普通のPythonでそれを行うことができます。しかし、正規表現を使用する方が良いと思います。すべて大文字と小文字を区別しない必要があります。

まず、どの辞書を探すべきかを認識します。キーを取得します。次に、ディクショナリで値を取得します。最後に、プレースホルダーを値に置き換えます。

たとえば、settings['name']carl」です。次に、行:

key2 = prefix + $global.name

次のように変更する必要があります。

key2 = prefixcarl

ありがとう。どんな助けでも大歓迎です:)

================================================== ===========

編集:

手元にあるもの: 1. $global、$lib、$args の辞書 2. 数百行。

取得したいもの: プレースホルダー$some.someが辞書の対応する値に変更された同じ行数。また、「+」は「連結」として表されます。

4

1 に答える 1

6

re.sub機能的な「置換」パラメータとともに使用します。

settings = {}
settings['name'] = 'carl'

key2 = "foo $global.name bar"

import re
print re.sub(r'\$(\w+)\.(\w+)', lambda m: settings[m.group(2)], key2)

repl が関数の場合、重複しないパターンの出現ごとに呼び出されます。この関数は単一の一致オブジェクト引数を取り、置換文字列を返します。

複数の辞書 (グローバルに定義されていると仮定) と「デフォルト」引数をサポートするバージョンを次に示します。

 re.sub(r'\$(\w+)(\.(\w+))?', lambda m: globals()[m.group(1)][m.group(3) or 'default'], key2)

globals()辞書が関数で定義されている場合、それらはもう属していませんがlocals()、その関数に属しています。それらにアクセスするには、クロージャーを使用する必要があります。

import re

def some_func():
    settings = {'result_dir':'dir'} 
    args = {'run_id':'id'} 

    vars = locals() 

    print re.sub(r'\$(\w+)(\.(\w+))?', lambda m: vars[m.group(1)][m.group(3)], '$settings.result_dir + $args.run_id')

some_func()

最後に、辞書がクラスにある場合は、getattr(self)それらにアクセスするために使用できます。

class X(object):

    def __init__(self):
        self.settings = {'result_dir':'dir'} 
        self.args = {'run_id':'id'} 

    def some_method(self):
        print re.sub(r'\$(\w+)(\.(\w+))?', lambda m: getattr(self, m.group(1))[m.group(3)], '$settings.result_dir + $args.run_id')


X().some_method()
于 2012-06-15T06:48:55.287 に答える