复制和替换,同时将符号保留在属于搜索词的括号内

时间:2017-01-06 17:25:02

标签: python replace

我需要在源代码文件中替换数千个匹配项。 有没有人知道如何在更换括号并保留其中的内容时将"bar"替换为"foo"? 这就是复制和替换应该如何工作:

    int v = -bar[0].fZ;
    int v = -bar[123].fZ;

替换为:

    int v = -foo.foo(0).fZ;
    int v = -foo.foo(123).fZ;

2 个答案:

答案 0 :(得分:1)

使用movie(frames) 函数的解决方案:

re.sub()

输出:

import re

code_content = '''
    int v = -bar[0].fZ;
    int v = -bar[123].fZ;
'''

code_content = re.sub(r'(\-)(bar)\[(\d+)\](?=\.\w+)', r'\1foo.foo(\3)', code_content, re.M)
print(code_content)

https://docs.python.org/3.1/library/re.html#re.sub

答案 1 :(得分:1)

regex允许您精确匹配字符串并在替换中重用匹配的组:

您可以捕获命名组((?P<number>\d+))中的数字,并在替换为\g<number>时引用它:

import re

text = '''int v = -bar[0].fZ;
int v = -bar[123].fZ;
'''

print(re.sub('int\ v\ =\ -(?P<bar>\w+)\[(?P<number>\d+)\]\.fZ;',
             'int v = -foo.foo(\g<number>).fZ;', text))

打印:

int v = -foo.foo(0).fZ;
int v = -foo.foo(123).fZ;

你可以自由地命名和引用更多的组(我也命名为<bar>,这里有点无意义,因为我没有在替换中引用它...)。