プログラミングのネタ帳

30代からプログラミングをはじめた。記憶力が悪いのでメモ代わりに。

2文字以上のスペースを1文字分のスペースに置換する

 

編集したいと思うファイルがスペース区切りということが多いです。

しかし、

・スペースの数がまちまちで、やたら多い。

・先頭にもスペース

ということがありました。

Linuxコマンドのsedやらを使って整形するのも手ですが、処理するプログラムで読み取りの際に整形する方が楽です。

というわけで、使用するのはre module のre.sub()関数を使用しました。

re --- 正規表現操作 — Python 3.9.2 ドキュメント

以下は文字列を受取処理して文字列を返すプログラムです


import re

#関数名convert_space reモジュールを使って文字列を置換
# 機能
#   2文字以上の連続するスペースを1文字のスペースに、
#   先頭のスペースを削除
# 引数(str,int) 1:文字列 2:n行目
# 戻り値 str, 引数で受け取った文字列の変換後
def convert_space(line,i):
    #re (正規表現操作) を用いて、二連続以上するスペース('\s+')を1スペースに変換(re.sub()関数を使う)
    line=re.sub(r'\s+',' ',line)
    #先頭のスペース('^\s')をなくす
    line=re.sub(r'^\s','',line)
    #line=line.lstrip()  #これでも可能
    return line
    

先頭のスペースの削除は、str.strip() or str.lstrip()でも可能です。

ファイル読み取りの際に利用することが多いと思います。

以前の記事と併せて、すぐに利用できるコードは以下になります。

myprograming-tips.hatenablog.jp

 


import re

#関数名convert_space reモジュールを使って文字列を置換
# 機能
#   2文字以上の連続するスペースを1文字のスペースに、
#   先頭のスペースを削除
# 引数(str,int) 1:文字列 2:n行目
# 戻り値 str, 引数で受け取った文字列の変換後
def convert_space(line,i):
    #re (正規表現操作) を用いて、二連続以上するスペース('\s+')を1スペースに変換(re.sub()関数を使う)
    line=re.sub(r'\s+',' ',line)
    #先頭のスペース('^\s')をなくす
    line=re.sub(r'^\s','',line)
    #line=line.lstrip()  #これでも可能
    return line

#readline()で各行を読み取るプログラム
#各行をconvert_space()で編集
def check_readline_behave():
    with open("text.txt","r") as f:
        i=0
        while(1):
            line=f.readline()
            #最終行は0を返す。最終行でbreak
            if(not line):break
            print(i,"行目 変換前",line,end="")
            line=convert_space(line,i)
            print(i,"行目 変換後",line)
            i=i+1
    
#テストデータ生成用のプログラム 
def make_test_data():
    with open("text.txt","w") as f:
        print("  1",file=f)
        print(" ",file=f)
        print("2 3   4 5  6",file=f)
        print("   22 333   4444     55555   ",file=f)

if __name__=="__main__":
    make_test_data()
    check_readline_behave()

実行結果
0 行目 変換前   1
0 行目 変換後 1 
1 行目 変換前
1 行目 変換後
2 行目 変換前 2 3   4 5  6
2 行目 変換後 2 3 4 5 6
3 行目 変換前    22 333   4444     55555
3 行目 変換後 22 333 4444 55555