2014-09-13 2 views
1

Итак, у меня есть следующий фрагмент кода.Найти замену словарей в regex

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 
) + " " 

Так, в принципе, если вы даете ему строку, которая содержит {{ссылка}}, он найдет примеры этого, и заменить их с данная ссылка. Проблема с ним в текущей форме заключается в том, что она может работать только на основе первой ссылки. Например, сказать, что мои ценности словарь был

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

+2

Имейте в виду, что '[Az]' не только APHA, она включает в себя все символы, которые находятся между '' Z' и Ā' , т.е. '[\]^_' и \ ' – Toto

+0

Это нормально, только я использую код, и я не намерен использовать какой-либо из этих символов. Я могу изменить его на '[A-Za-z]' в любом случае, спасибо за головы –

+1

Возможно ли использовать другой формат ссылки '{{reference}}'? Потому что, если вы могли бы изменить его на {reference}, тогда вы могли бы просто: '' это тестовая строка для {bob}, созданная с использованием {foo} '. Format (** values) ' – miszczu

ответ

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 
+0

, это оставляет {{}} on с каждой стороны строки, я хочу, чтобы они были удалены. Можете ли вы добавить это, пожалуйста? –

+0

понял это: 'item = item.replace (" {{"+ r +"}} ", values ​​[r])' –

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) 
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 
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' 
Смежные вопросы