在正则表达式中查找替换词典

时间:2014-09-13 11:04:58

标签: python regex dictionary search regex-group

好的,我有以下代码。

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}}

,代码也需要工作

4 个答案:

答案 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'