Pythonで複数行に渡る文字列を別の文字列へ置換したい場合、re
モジュールのre.DOTALL
を指定してre.sub()
を使用する。
サンプルコード解説
以下は、ファイルの中の複数行の文字列に一致する箇所を新たな複数行の文字列に置換し、同名のファイルとして保存するサンプルコードとなる。
multiline_convert.py
#!/usr/bin/env python3
import sys
import re
target = r'\tfor \(hoge\) {\n\t\thogehoge;\n\t}*'
replace = """ if (hoge) {}
for (hoge) {
hogehoge;
}
}"""
f1 = open(sys.argv[1],'r')
f2 = open(sys.argv[1]+"_new",'w')
body = f1.read()
distbody = re.sub(target, replace, body, flags=re.DOTALL)
f2.write(distbody)
f1.close()
f2.close()
os.remove(sys.argv[1])
os.rename(sys.argv[1]+"_new", sys.argv[1])
target
はタブや改行も含め、すべて正規表現で記述する必要がある。
サンプルコードでは以下の文字列を意図している。
for (hoge) {
hogehoge;
}
replace
は改行を含む文字列として記述できる。
サンプルコードでは以下の文字列を意図している。
if (hoge) {}
for (hoge) {
hogehoge;
}
}
サンプルコードの呼び出し方法
サンプルコードを使う時は以下のように呼び出す。
python multiline_convert.py hoge.txt
サンプルコードに記載したtarget
とreplace
の場合だと、以下のような結果となる。
hoge.txt(置換前)
hoge1
hoge2
for (hoge) {
hogehoge;
}
eof
hoge.txt(置換後)
hoge1
hoge2
if (hoge) {
for (hoge) {
hogehoge;
}
}
eof
おわりに
ターゲットにする複数行文字列を正規表現での文字列に変換できるスクリプトが欲しい