2012-12-05 2 views
0

Я хочу найти подстроку в строке и заменить ее другим шаблоном. Строка поиска находится между фигурными фигурными скобками.Поиск и замена подстроки

Пример строка

line = $lang['MY_KEY'] = '{search-string} wird in Analyse berücksichtigt'; 

Я попробовал этот код:

re.sub('([a-zA-Z0-9\[\]\$\' ].*{).*(}[a-zA-Z\.,; ].*)','\1replace-string\2',line) 

А также:

re.sub('(.*{).*(}.*)', '\1replace-string\2', line) 

я получаю некоторые символы нежелательных вместе с заменой струной в выход.

EDIT

У меня есть еще один вопрос.
В фигурных скобках имеется несколько строк поиска. Я хочу заменить каждую подстроку разными шаблонами. Как мне это сделать?

ответ

2

Как у вас есть обратные слэши префикс модели и замены с г: -

print re.sub(r'([a-zA-Z0-9\[\]\$\' ].*{).*(}[a-zA-Z\.,; ].*)',r'\1replace-string\2',line) 

print re.sub(r'(.*{).*(}.*)', r'\1replace-string\2', line) 

EDIT: заменить каждое второе вхождение, используя функцию ЗАМЕНЫ

import re 
def repl(matchobj): 
    global counter 
    counter = counter+1 
    if counter == 2: 
     return '{replace-string}' 
    else: 
     return matchobj.group(0) 

counter = 0 
line = "$lang['MY_KEY'] = '{search-string} wird in Analyse {search-string} bercksichtigt'"; 
print re.sub(r'{.*?}',repl,line) 

EDIT: Используйте словарь для хранения замены

import re 
def repl(matchobj): 
    global counter 
    replacementFor = {'{search-string1}': '{replace-string1}', 
         '{search-string2}': '{replace-string2}', 
         '{search-string3}': '{replace-string3}'} 

    counter = counter+1 
    if counter == 2: 
     return replacementFor.get(matchobj.group(0), matchobj.group(0)) 
    else: 
     return matchobj.group(0) 

counter = 0 
line = "$lang['MY_KEY'] = '{search-string} wird in Analyse {search-string1} bercksichtigt'"; 
print re.sub(r'{.*?}',repl,line) 

counter = 0 
line = "$lang['MY_KEY'] = '{search-string} wird in Analyse {search-string3} bercksichtigt'"; 
print re.sub(r'{.*?}',repl,line) 
+0

Работал как шарм. – cppcoder

+0

Как я могу указать возникновение, которое нужно заменить? Я хочу заменить только первое вхождение. – cppcoder

+0

Используйте аргумент count. См. Http://docs.python.org/2/library/re.html – Himanshu

2

Не уверен в символах нежелательной почты, но не из int исправить то, что не так с re.sub('{.*}', 'frob', line)?

+0

Это тоже сработало .. – cppcoder

+0

Я принимаю это решение в своем коде, так как это легко. Однако я бы отметил другого как ответ, так как он опубликовал первый, и он также работал. – cppcoder

+0

Если вы приняли это решение в своем коде, вы должны его принять. Не принимайте ответ, потому что он был опубликован первым. Примите лучший ответ, а не самый быстрый ответ. Это поможет другим позже, когда у них возникнет аналогичная проблема, и найдите этот вопрос, ища решения. – alan

0

я думаю, что это должно работать для вас:

line = '{search-string} wird in {Analyse} berücksichtigt' 

>>> print re.sub(r'(^.*?{)[^}]*(}.*)', r'\1replace-string\2', line) 
{replace-string} wird in {Analyse} berücksichtigt 
Смежные вопросы