Удаление / замена разделов многострочного кода на 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(...))
Я бы подумал, что кто-то, возможно, решил что-то подобное раньше 🙂
- python случайным образом сортирует элементы одинакового значения
- Одиночная строка кода для проверки ключа в двумерном вложенном внутреннем словаре
- Как я могу суммировать произведение двух элементов списка, используя для цикла в python?
- python Как обрезать конечные пробелы в csv DictReader
- Перекрестные аргументы ключевого слова
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(...))
- Панды перетасовывают ряды на определенном уровне
- Psycopg / Postgres: подключения случайным образом вывешиваются
- python, как изменить функциональность метода во время выполнения
- Экземпляр класса Python, который отвечает на все вызовы методов
- Перейдите через список Python и сделайте что-нибудь на последнем элементе
- Отказоустойчивость для длинных сценариев python
- Сканирование списка
- Как написать список списков в txt-файл?
- Есть ли простой для разделения и воссоединения tarfile с помощью python?
- HttpError 400 при попытке загрузить файл PDF в облачном хранилище Google
- метод класса __instancecheck__ не работает