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)

我在输出中收到了一些垃圾字符以及替换字符串。

编辑

我还有一个问题。
花括号中有多个搜索字符串。我想用不同的模式替换每个子字符串。我该怎么做?

4

3 回答 3

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)
于 2012-12-05T10:01:13.167 回答
2

不确定垃圾字符,但出于兴趣,有什么问题re.sub('{.*}', 'frob', line)

于 2012-12-05T10:03:50.110 回答
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
于 2012-12-05T10:53:20.347 回答