2

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(...))

誰かが以前に似たようなことを解決したかもしれないと思います:)

4

2 に答える 2

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(...))
于 2012-04-25T16:02:38.320 に答える
2

Pyparsing には、ネストされた括弧テキストを照合するための組み込み機能がいくつかあります。あなたの場合、実際には括弧の内容を抽出しようとしているのではなく、最も外側の '(' と ')' の間のテキストが必要なだけです。

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)
于 2012-04-25T20:11:21.767 に答える