最近、業務でPythonを使用することがあり、普段は使用しないこともあり、丁寧に日本語コメントが挿入されているプログラムを貰いました。
展開先が外国だったので、何度も手動で置換や消去が面倒くさかったので、コメントアウトされている日本語をとりあえず全て削除して元プログラムとは別にして保存するプログラムを作成しました。
この記事の対象
実際のコード
import re
# 元のファイル名と、新しいファイル名を指定
original_file = "test3.py"
new_file = "test3_jp2.py"
# 新しいファイルを作成し、元のファイルを1行ずつ読み込む
with open(new_file, "w", encoding="utf-8") as output_file, open(original_file, "r", encoding="utf-8") as input_file:
    for line in input_file:
        # コメントアウトされた日本語を削除
        new_line = re.sub(r'#.*[ぁ-んァ-ン一-龥]+.*', '', line)
        output_file.write(new_line)コード解説
| 行 | 説明 | 
|---|---|
| original_file/new_file | 処理対象と保存先のファイル名を指定します。 | 
| with open(...) | input_fileで元ファイルを読み、output_fileに結果を保存します。 | 
| for line in input_file: | ファイルを1行ずつ処理します。 | 
| re.sub(...) | 正規表現で、日本語が含まれるコメント行( #から始まり日本語を含む)を削除します。 | 
| output_file.write(new_line) | 処理済みの行を新しいファイルに書き出します。 | 
正規表現のポイント
re.sub(r'#.*[ぁ-んァ-ン一-龥]+.*', '', line)このパターンは:
- #.*:- #で始まるコメントを対象に
- [ぁ-んァ-ン一-龥]+:日本語が含まれているかをチェック
- .*:その後の文字列も含めて削除対象
つまり「コメントで、かつ日本語を含む行だけを削除」します。
実行結果のイメージ
例えば次のようなファイル:
print("Hello")  # 日本語のコメント
x = 10  # 英語: set valueスクリプト実行後はこうなります:
print("Hello")  
x = 10  # 英語: set value【補足】オプション
英語コメントを残し、日本語コメントのみ削除する
import re
original_file = "test3.py"
new_file = "test3_no_jp_comment.py"
with open(new_file, "w", encoding="utf-8") as output_file, open(original_file, "r", encoding="utf-8") as input_file:
    for line in input_file:
        # 日本語を含むコメント行のみ削除(#があり日本語が含まれる)
        if re.search(r'#.*[ぁ-んァ-ン一-龥]', line):
            line = re.sub(r'#.*[ぁ-んァ-ン一-龥]+.*', '', line)
        output_file.write(line)行末にある日本語コメントだけ削除(コード本体は残す)
import re
original_file = "test3.py"
new_file = "test3_remove_jp_tail.py"
with open(new_file, "w", encoding="utf-8") as output_file, open(original_file, "r", encoding="utf-8") as input_file:
    for line in input_file:
        # 行末の日本語コメントだけ削除(#以降に日本語がある場合)
        line = re.sub(r'#.*[ぁ-んァ-ン一-龥]+.*$', '', line)
        output_file.write(line)#のない日本語行も削除対象にする(全行チェック)
import re
original_file = "test3.py"
new_file = "test3_remove_all_japanese_lines.py"
with open(new_file, "w", encoding="utf-8") as output_file, open(original_file, "r", encoding="utf-8") as input_file:
    for line in input_file:
        # 行内に日本語がある行はスキップ(書き込まない)
        if not re.search(r'[ぁ-んァ-ン一-龥]', line):
            output_file.write(line)用語補足
- [ぁ-んァ-ン一-龥]は日本語のひらがな・カタカナ・漢字を表す正規表現です。
- re.sub()は該当文字列の置換、- re.search()は該当行を判定に使います。
関連記事
正規表現についてより知りたい方、GUIツール化に興味がある方は以下をクリック!

