2018年02月12日

言語処理100本ノックでPython入門 #11 - 文字列の置換

  
本日は、言語処理100本ノック 2015の問題11に挑戦です。

■ 問題
hightemp.txtは,日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,hightemp.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.

11. タブをスペースに置換
タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

■ Pythonのコード

import re

def tabToSpace(source):
    return re.sub(r'\t', ' ', source)


def main():
    with open('hightemp.txt', 'r', encoding='utf8') as f:
        for line in f:
            print(tabToSpace(line.rstrip()))

    with open('hightemp.txt', 'r', encoding='utf8') as f:
        print(tabToSpace(f.read()))

if __name__ == '__main__':
    main()


■ 正規表現


正規表現を使うには、
import re
と、importします。 タブを1文字空白に置き換えるには、subメソッドを使います。
def tabToSpace(source):
    return re.sub(r'\t', ' ', source)
Python の r'...' という raw string 記法を使うのが無難。C#の逐語的文字列リテラルと同じかな。

でも、この例に限れば、以下のように書けるので、そもそも正規表現使う必要もなかったですね。
return source.replace('\t', ' ' )
関数定義する必要もないですが、ここでは、tabToSpaceを定義してみました。 


■ テキストファイルの入力(readメソッド)

'hightemp.txt'を入力ファイルとして、以下のようなコードを書きました。
with open('hightemp.txt', 'r', encoding='utf8') as f:
    for line in f:
        print(tabToSpace(line.rstrip()))

rstripは、右側の空白を除去するメソッドです。

'hightemp.txt'そのものを書き換えよという問題ではないと思うので、コンソールに出力しています。

ファイルの内容を全部メモリに入れてしまって
with open('hightemp.txt', 'r', encoding='utf8') as f:
    print(tabToSpace(f.read()))
としても良いですね。
このほうが、改行コードを取り除くコードが不要になるのでコードが短くなります。hightemp.txt'ファイルがとても小さなものなので、このほうが良いかもです。