我有一堆字符串,一些我需要替换它的一部分。但是,需要更换的部件之前和之后的部件并不总是相同的。此外,需要替换的字符串部分不是我可以匹配的正则表达式,而不匹配我不想替换的其他部分。例如:
"prefixA_REPLACEME_postfixA",
"prefixB_SOMETHING_postfixB",
"prefixA_LLAMAS_postfixC",
"prefixB_DONTREPLACE_postfixA",
变成:
"prefixA_NEWSTR_postfixA",
"prefixB_NEWSTR_postfixB",
"prefixA_NEWSTR_postfixC",
"prefixB_DONTREPLACE_postfixA",
我希望用一个正则表达式做到这一点,就像这样:
re.sub('(prefixA_).*(_postfixA)|(prefixB_).*(_postfixB)|(prefixA_).*(_postfixC)', '\\1NEWSTR\\2', stringToFix)
不幸的是,这不起作用,因为第1组和第2组是(prefixA_)
和(postfixA)
,无论这是否是最终被使用的正则表达式的一部分。我也不能用这个
re.sub('(?P<one>prefixA_).*(?P<two>_postfixA)|(?P<one>prefixB_).*(?P<two>_postfixB)|(?P<one>prefixA_).*(?P<two>_postfixC)', '\\1NEWSTR\\2', stringToFix)
因为它给了我错误
sre_constants.error: redefinition of group name 'one' as group 3; was group 1
其他不起作用的是
re.sub('(prefixA_|prefixB).*(_postfixA|_postfixB|_postfixC)', '\\1NEWSTR\\2', stringToFix)
因为这会捕获第四个字符串,我不想匹配。
那么有没有一种方法可以使任何未捕获的组都不计算(这会使我的第一个正则表达式正常工作)?或者使用单个正则表达式执行此操作的任何其他方法?
答案 0 :(得分:2)
您无法在同一个正则表达式中多次定义命名捕获组(与.NET之类的其他正则表达式不同)。但由于你没有对前缀和后缀做任何事情,你只需使用lookaround assertions:
>>> s = """prefixA_REPLACEME_postfixA
... prefixB_SOMETHING_postfixB
... prefixA_LLAMAS_postfixC
... prefixB_DONTREPLACE_postfixA"""
>>> import re
>>> print re.sub("(?<=prefixA).*(?=postfixA)|(?<=prefixB).*(?=postfixB)|(?<=prefixA).*(?=postfixC)", "_NEWSTR_", s)
prefixA_NEWSTR_postfixA
prefixB_NEWSTR_postfixB
prefixA_NEWSTR_postfixC
prefixB_DONTREPLACE_postfixA
答案 1 :(得分:0)
看起来你想要做的就是使用
if re.search("shouldReplaceRegex",matchstring): matchstring = re.sub("_.*?_","_yourReplacement_",matchstring)