2017-01-06 5 views
1

Мне нужно заменить тысячи совпадений в файле исходного кода. Кто-нибудь знает, как заменить "bar" на "foo" при обмене скобками и сохранении того, что внутри? Это как копия и заменить должно работать:Скопируйте и замените, сохранив знаки в скобках, принадлежащих поисковому запросу

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

заменить:

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

ответ

1

Решение с использованием 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) 

Выход:

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

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

+0

спасибо, что это хорошо работает – dgrat

+0

@dgrat, добро пожаловать – RomanPerekhrest

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>, который здесь немного бессмыслен, так как я не ссылаюсь на него в подстановке ...).

+0

спасибо, что работает хорошо – dgrat