好的,我有以下代码。
out = out + re.sub('\{\{([A-z]+)\}\}', values[re.search('\{\{([A-z]+)\}\}',item).group().strip('{}')],item) + " "
或者,更多细分:
out = out + re.sub(
'\{\{([A-z]+)\}\}',
values[
re.search(
'\{\{([A-z]+)\}\}',
item
).group().strip('{}')
],
item
) + " "
所以,基本上,如果你给它一个包含{{reference}}的字符串,它会找到它的实例,并用给定的引用替换它们。它当前形式的问题在于它只能基于第一个引用工作。例如,假设我的值词典是
values = {
'bob': 'steve',
'foo': 'bar'
}
我们传递了字符串
item = 'this is a test string for {{bob}}, made using {{foo}}'
我希望它放入out
'this is a test string for steve, made using bar'
但目前输出的是
'this is a test string for steve, made using steve'
如何更改代码,使其考虑循环中的位置。
应该注意的是,进行单词拆分不起作用,因为即使输入为{{foo}}{{steve}}
答案 0 :(得分:0)
我使用以下代码获得输出
replace_dict = { 'bob': 'steve','foo': 'bar'}
item = 'this is a test string for {{foo}}, made using {{steve}}'
replace_lst = re.findall('\{\{([A-z]+)\}\}', item)
out = ''
for r in replace_lst:
if r in replace_dict:
item = item.replace('{{' + r + '}}', replace_dict[r])
print item
答案 1 :(得分:0)
这是怎么回事?
import re
values = {
'bob': 'steve',
'foo': 'bar'
}
item = 'this is a test string for {{bob}}, made using {{foo}}'
pat = re.compile(r'\{\{(.*?)\}\}')
fields = pat.split(item)
fields[1] = values[fields[1]]
fields[3] = values[fields[3]]
print ''.join(fields)
答案 2 :(得分:0)
如果您可以将引用格式从{{reference}}
更改为{reference}
,则可以使用格式化方法(而不是使用正则表达式)来满足您的需求:
values = {
'bob': 'steve',
'foo': 'bar'
}
item = 'this is a test string for {bob}, made using {foo}'
print(item.format(**values))
# prints: this is a test string for steve, made using bar
答案 3 :(得分:0)
在您的代码中,每次调用时,re.search
都会从字符串的开头开始查看,因此始终返回第一个匹配{{bob}}
。
您可以passing a function as replacement to re.sub
访问您当前正在替换的匹配对象:
values = { 'bob': 'steve','foo': 'bar'}
item = 'this is a test string for {{bob}}, made using {{foo}}'
pattern = r'{{([A-Za-z]+)}}'
# replacement function
def get_value(match):
return values[match.group(1)]
result = re.sub(pattern, get_value, item)
# print result => 'this is a test string for steve, made using bar'