Python 搜寻及;替换子字符串

Python 搜寻及;替换子字符串,python,regex,Python,Regex,我想在字符串中搜索一个子字符串并替换为另一个模式。 搜索字符串位于大括号之间 示例字符串 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('(.*{).*(}.*)', '\1replac

我想在字符串中搜索一个子字符串并替换为另一个模式。 搜索字符串位于大括号之间

示例字符串

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)
我在输出中得到了一些垃圾字符和替换字符串

编辑

line = $lang['MY_KEY'] = '{search-string} wird in Analyse berücksichtigt';
我还有一个问题。

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

因为在图案和替换物前面有反斜杠,前面有一个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)

由于反斜杠在图案和替换前加上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)

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

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

我认为这应该适合你:

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

>>> print re.sub(r'(^.*?{)[^}]*(}.*)', r'\1replace-string\2', line)
{replace-string} wird in {Analyse} berücksichtigt

我认为这应该适合你:

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

>>> print re.sub(r'(^.*?{)[^}]*(}.*)', r'\1replace-string\2', line)
{replace-string} wird in {Analyse} berücksichtigt

我在代码中采用了这个解决方案,因为它很简单。然而,我会将另一个标记为答案,因为他首先发布了,而且它也有效。如果您在代码中采用了此解决方案,您应该接受它。不要接受答案,因为它是先发布的。接受最好的答案,而不是最快的答案。这将有助于其他人以后遇到类似问题时,发现这个问题并寻找解决方案。我在我的代码中采用这个解决方案,因为它很简单。然而,我会将另一个标记为答案,因为他首先发布了,而且它也有效。如果您在代码中采用了此解决方案,您应该接受它。不要接受答案,因为它是先发布的。接受最好的答案,而不是最快的答案。这将有助于其他人在以后遇到类似问题时发现此问题并寻求解决方案。如何指定要替换的事件?我只想替换第一次出现的。已检查。计数指定要替换的引用数。如果我想单独替换第二个事件,我应该怎么做?在这种情况下,您可以考虑使用REPL函数,而不是使用一个全局计数器的字符串,每个计数器都重置一个全局计数器。对于除第二个以外的每个匹配,返回相同的字符串。对于第二个,返回替换项。此外,搜索字符串也不相同。大括号中的每个子字符串都可以不同。如何指定要替换的引用?我只想替换第一次出现的。已检查。计数指定要替换的引用数。如果我想单独替换第二个事件,我应该怎么做?在这种情况下,您可以考虑使用REPL函数,而不是使用一个全局计数器的字符串,每个计数器都重置一个全局计数器。对于除第二个以外的每个匹配,返回相同的字符串。对于第二个,返回替换项。此外,搜索字符串也不相同。大括号中的每个子字符串可以不同