使用python删除/替换多行代码段

时间:2012-04-25 15:01:56

标签: python

我试图在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(...))

我认为有人可能在以前解决了类似问题:)

2 个答案:

答案 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)