2012-12-05 199 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) 

我得到一些垃圾字符替換字符串沿輸出。

編輯

我有一個問題。
花括號中有多個搜索字符串。我想用不同的模式替換每個子字符串。我該怎麼做?

回答

2

當你有反斜槓前綴模式和替換與R: -

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) 

編輯:使用替換功能

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) 

編輯替換每一秒發生:使用字典存儲替換

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

This too worked .. – 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