我使用下面的代码查找"<<"和">>"在一个字符串中,用相关的先前定义的变量替换它们。这有效,但有更安全或更有效的方法来实现这一目标吗?我已经看到有关使用eval的几个警告,我的解决方案似乎过于复杂。
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
答案 0 :(得分:1)
使用字典和lambda函数作为替换:
Date_sequence={}
for item, frame in sample_data.ix[:,2:102].iteritems():
if frame>=sample_data.ix[:,1] and frame<=sample_data.ix[:,2]:
Date_sequence['item'] = frame
如果您不确定>>> 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.'
和<<
之间的每个字符串是否都是字典中的键,请将>>
更改为所有可用键的替换:[^>]*
。如果你需要很多键并且你不想手工制作它,你可以像这样动态地构建模式:
python 2.7:
aa|bb|cc
python 3.x:
>>> re.sub(r'<<(%s)>>'%"|".join(sorted(dico.keys(), reverse=True)), lambda x: dico[x.group(1)], teststr)
答案 1 :(得分: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.