2017-03-18 18 views
0

文字列に "< <"と ">>"で囲まれた単語を検索し、関連する以前に定義された変数に置き換えます。これはうまくいきますが、これを達成するためのより安全で効率的な方法がありますか?私はevalの使用に関するいくつかの警告を見てきましたが、私の解決策はあまりにも複雑に思えます。文字列内の動的変数をPythonに置き換える方法

import re 

aa = 'alpha' 
bb = 'beta' 
cc = 'gamma' 

teststr = 'A for <<aa>>, b means <<bb>>, and c could be <<cc>>.' 

matches = re.finditer('<<(\w*)>>', teststr) 

for i in matches: 
    teststr = teststr.replace(i.group(0), eval(i.group(1))) 

print teststr 

答えて

1

代替として辞書とラムダ関数を使用します。

>>> import re 
>>> teststr = 'A for <<aa>>, b means <<bb>>, and c could be <<cc>>.' 
>>> dico = { 'aa':'alpha', 'bb':'beta', 'cc':'gamma' } 
>>> re.sub(r'<<([^>]*)>>', lambda m: dico[m.group(1)], teststr) 
'A for alpha, b means beta, and c could be gamma.' 

あなたは<<>>間の各文字列が辞書でキーとして存在していることを確認していない場合は、すべてのと交互に変更[^>]*を利用可能なキー:aa|bb|cc

のpython 2.7:

>>> re.sub(r'<<(%s)>>'%"|".join(sorted(dico.keys(), reverse=True)), lambda x: dico[x.group(1)], teststr) 

のpython 3.xの:

>>> re.sub(r'<<({})>>'.format("|".join(sorted(dico.keys(), reverse=True))), lambda x: dico[x.group(1)], teststr) 
あなたは多くのキーを持っていて、手でそれを作るためにしたくない場合は、動的にこのようなパターンを構築することができます
0

dictを使用して置換を取得します。

import re 
d = {'aa': 'alpha', 'bb': 'beta', 'cc': 'gamma'} 

teststr = 'A for <<aa>>, b means <<bb>>, and c could be <<cc>>.' 
matches = re.finditer('<<(\w*)>>', teststr) 
for i in matches: 
    teststr = teststr.replace(i.group(0), d[i.group(1)]) 
print(teststr) 

プリントA for alpha, b means beta, and c could be gamma.

関連する問題