Удаление / замена разделов многострочного кода на python

Я пытаюсь удалить несколько строк, содержащих фрагмент фрагментированного кода из разных файлов, с помощью python. Я искал некоторые примеры, но не мог найти то, что искал. В основном мне нужно что-то, что делает в принципе следующее (содержит синтаксис не-питона):

def cleanCode(filepath): """Clean out the obsolete or superflous 'bar()' code.""" with open(filepath, 'r') as foo_file: string = foo_file[index_of("bar("):] depth = 0 for char in string: if char == "(": depth += 1 if char == ")": depth -= 1 if depth == 0: last_index = current_char_position with open(filepath,'w') as foo_file: mo_file.write(string) 

Дело в том, что конструктор, который я обрабатываю и хочу заменить, может содержать другие вложенные операторы, которые также необходимо удалить как часть удаления bar(...) .

Вот пример, который будет очищен, фрагмент кода будет выглядеть так:

 annotation ( foo1(k=3), bar( x=0.29, y=0, bar1( x=3, y=4), width=0.71, height=0.85), foo2(System(...)) 

Я бы подумал, что кто-то, возможно, решил что-то подобное раньше 🙂

Pyparsing имеет несколько встроенных модулей для сопоставления вложенного в скобках текста – в вашем случае вы на самом деле не пытаетесь извлечь содержимое из parens, вам просто нужен текст между внешним ('и') '.

 from pyparsing import White, Keyword, nestedExpr, lineEnd, Suppress insource = """ annotation ( foo1(k=3), bar( x=0.29, y=0, bar1( x=3, y=4), width=0.71, height=0.85), foo2(System(...)) """ barRef = White(' \t') + Keyword('bar') + nestedExpr() + ',' + lineEnd out = Suppress(barRef).transformString(insource) print out 

Печать

 annotation ( foo1(k=3), foo2(System(...)) 

EDIT: действие синтаксического разбора, чтобы не вызывать вызовы bar (), заканчивающиеся на '85':

 barRef = White(' \t') + Keyword('bar') + nestedExpr()('barargs') + ',' def skipEndingIn85(tokens): if tokens.barargs[0][-1].endswith('85'): raise ParseException('ends with 85, skipping...') barRef.setParseAction(skipEndingIn85) 

попробуй это :

 clo=0 def remov(bar): global clo open_tag=strs.find('(',bar) # search for a '(' open tag close_tag=strs.find(')',bar)# search for a ')' close tag if open_tag > close_tag: clo=strs.find(')',close_tag+1) elif open_tag < close_tag and open_tag!=-1: remov(close_tag) f=open('small.in') strs="".join(f.readlines()) bar=strs.find('bar(') remov(bar+4) new_strs=strs[0:bar]+strs[clo+2:] print(new_strs) f.close() 

вывод:

 annotation ( foo1(k=3), foo2(System(...))