2017-07-27 7 views
1

私はLinux上でコンパイルするにはあまりにもクリーンなC++ファイルを試しています。具体的には、バックスラッシュ '\'を#include文の中のスラッシュ「/」で置き換えようとしています(私はPythonを使用する必要があります)。 残念ながら、スクリプトは最後のブラケットを除いて、ほぼすべて削除します。私はこのスクリプトを使用していますPythonの正規表現があまりにも多くを削除します

} 

import os 
import re 
for dirpath, dirnames, filenames in os.walk(".\Source", topdown=True): 
    for file in filenames: 
     file = os.path.join(dirpath, file) 
     tempfile = file + ".bak" 
     with open(tempfile, "w") as target: 
      with open(file) as source: 
       for line in source: 
        if "#include" in line: 
         re.sub("\\\\", "/", line) 
       target.write(line) 
     os.remove(file) 
     os.rename(tempfile, file) 

編集:サイモン・フレーザーの提案を実装した後 を、スクリプトは正常に動作します。それは次のようになります。forループ内

for line in source: 
    if "#include" in line: 
     re.sub("\\\\", "/", line) 
target.write(line) 

、何もファイルtargetに書き込まれません。

import os 
import re 
for dirpath, dirnames, filenames in os.walk(".\Source", topdown=True): 
    for file in filenames: 
     file = os.path.join(dirpath, file) 
     tempfile = file + ".bak" 
     with open(tempfile, "w") as target: 
      with open(file) as source: 
       for line in source: 
        if "#include" in line: 
         line = re.sub(r"\\", "/", line) 
        target.write(line) 
     os.remove(file) 
     os.rename(tempfile, file) 
+0

それは、このメソッドのために正規表現ライブラリを使用する必要があります:

for line in source: if "#include" in line: line = re.sub("\\\\", "/", line) target.write(line) 

文字列も速いかもしれ.replace方法を、持っていますか?それはforループを使って簡単に行うことができるので、 –

+0

質問のコードは正しく字下げされていますか? 'target.write(line)'は 'for'ループの中にないので、最後の行だけを書き出します。 –

答えて

2

は、このセクションを考えてみましょう。 forループが終了すると、最後の値lineが書き出されます。その結果、最後に}が出力されている可能性があります。

target.writeforループ内で動かすとうまくいくはずです。 re.subはを置き換えるのではなく、新しい値をに戻すので、そこにも変数の割り当てが必要です。

for line in source: 
    if '#include' in line: 
     line = line.replace('\\','/') 
    target.write(line) 
+0

それは私の問題のすべてを修正しました。ありがとうございました。 –

関連する問題