我试图在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(...))
我认为有人可能在以前解决了类似问题:)
答案 0 :(得分:2)
试试这个:
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(...))
答案 1 :(得分:2)
Pyparsing有一些用于匹配嵌套括号文本的内置函数 - 在你的情况下,你并不是真的想要提取parens的内容,你只需要最外面的'('和')'之间的文本。 / p>
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(...))
编辑:解析动作以不剥离以'85'结尾的bar()调用:
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)