カスタム関数シリーズでは、便利なオリジナル関数を紹介しています。
※カスタム関数は、一般的には「ユーザー定義関数」と呼ばれています
- LeftGet(s,no) 文字列 s の左からno個取り出す
- RightGet(s,no) 文字列 s の右からno個取り出す
- LeftRemove(s,no) 文字列 s の左からno個を除去した残りを返す
- RightRemove(s,no) 文字列s の右からno個を除去した残りを返す
- MidGet(s,start,no) 文字列sの左からstart個目からno個を取得
- RightSearchRemove(s,search) 検索文字以降を除去した残り
- RightSearchGet(s,search) 検索文字以降の文字列を返す
- SeparateSearch(s,search) 検索文字列で文字列を分割する
- SearchDelete(s,search) 検索文字列を文字列中から削除する
- 文字列関数関連の使い方
LeftGet(s,no) 文字列 s の左からno個取り出す
def LeftGet(data,no): #左からno個を取り出す return data[0:no]
昔懐かしいN88BASICなどで標準関数として存在していた「LEFT$」と同じです。現代では通じることが少ない説明かも(^^;)
コードを見れば、おわかりのとおり、関数にするまでもなく、pythonでは文字列はタプルなのでスライスを使うと簡単に表現できます。 data[0:no] このようにできます。
RightGet(s,no) 文字列 s の右からno個取り出す
def RightGet(data,no): #右からno個を取り出す l=len(data) return data[l-no:l]
この関数では、一度文字列数をlenで計算しています。ただし、data[len(data)-no:len(data)]
と書けば、一発で出せますが、わざわざ関数にしておくとコードを理解しやすくできると思います。
LeftRemove(s,no) 文字列 s の左からno個を除去した残りを返す
def LeftRemove(data,no): #左からno個を除去した残りを返す return data[no:]
スライス一発でできる内容ですね。
RightRemove(s,no) 文字列s の右からno個を除去した残りを返す
def RightRemove(data,no): #右からno個を除去した残りを返す l=len(data) return data[0:l-no]
文字列全体の数を求めてからスライスで求めています。
MidGet(s,start,no) 文字列sの左からstart個目からno個を取得
def MidGet(data,start,no): #左からstart個目からno個の文字列を取り出す return data[start-1:no+start-1]
BASICのmid$関数と同じく(BASICはもうええか(^^;))、左からStart番目からno個の文字列を取り出して、返します。
RightSearchRemove(s,search) 検索文字以降を除去した残り
def RightSearchRemove(data,search): #検索文字以降を除去した残りを返す #ex) '1234567890.123' --->search '.' --> '1234567890' start=data.rfind(search) if start!=-1: l=len(data[start:]) out_data=RightRemove(data,l) else: out_data='NoFind' return out_data
ここでは、文字列.rfindという文字列関数を使って、検索文字の位置を取得してから
検索文字列以降を除去しています。前回登場したRightRemoveも使っています。
また、検索文字列が見つからない場合は、戻り値として文字列「NoFind」が返ってきます。
RightSearchGet(s,search) 検索文字以降の文字列を返す
def RightSearchGet(data,search): #検索文字以降の文字を返す #ex) '1234567890.123' ---> search '.' --> 123 start=data.rfind(search) if start!=-1: l=len(data[start:]) out_data=data[start+len(search):] else: out_data='NoFind' return out_data
ここでは、さきほどとは逆に検索した文字列以降を返します。
また、検索文字列が見つからない場合は、戻り値として文字列「NoFind」が返ってきます
SeparateSearch(s,search) 検索文字列で文字列を分割する
def SeparateSearch(data,search): #検索文字で分割する #ex) '1234567890.123' ---> search '.' --> 1234567890,123 out_list=data.split(search) return out_list
文字列.split関数を使って分割しています。戻り値はリストとなります。
もし、検索文字列が複数見つかると、分割数も3つ以上になります。
SearchDelete(s,search) 検索文字列を文字列中から削除する
def SearchDelete(data,search): #検索文字列を削除する #ex) '1234567890.123' ---> search '.' --> 1234567890123 return data.replace(search,'')
検索文字列を除去するという表現にしていますが、指定した文字列を除去していることを意味しています。もし、検索文字列がない場合は、何もせずに元の文字列を返します。
文字列関数関連の使い方
簡単なので、使い方はもうお分かりでしょうが、一応、実装した形でも掲載しますね。
#####文字列処理##### def LeftGet(data,no): #左からno個を取り出す return data[0:no] def RightGet(data,no): #右からno個を取り出す l=len(data) return data[l-no:l] def LeftRemove(data,no): #左からno個を除去した残りを返す return data[no:] def RightRemove(data,no): #右からno個を除去した残りを返す l=len(data) return data[0:l-no] def MidGet(data,start,no): #左からstart個目からno個の文字列を取り出す return data[start-1:no+start-1] def RightSearchRemove(data,search): #検索文字以降を除去した残りを返す #ex) '1234567890.123' --->search '.' --> '1234567890' start=data.rfind(search) if start!=-1: l=len(data[start:]) out_data=RightRemove(data,l) else: out_data='NoFind' return out_data def RightSearchGet(data,search): #検索文字以降の文字を返す #ex) '1234567890.123' ---> search '.' --> 123 start=data.rfind(search) if start!=-1: l=len(data[start:]) out_data=data[start+len(search):] else: out_data='NoFind' return out_data def SeparateSearch(data,search): #検索文字で分割する #ex) '1234567890.123' ---> search '.' --> 1234567890,123 out_list=data.split(search) return out_list def SearchDelete(data,search): #検索文字列を削除する #ex) '1234567890.123' ---> search '.' --> 1234567890123 return data.replace(search,'') ######################################################################################## def test_J809_3(): #文字列処理関連 s='1234567890.abc' print(f'入力文字列:{s}') no=4 s2=LeftGet(s,no) print(f'左から{no}個の文字を取り出す LeftGet -> 入力:{s} 出力:{s2:20} num:{no}') no=5 s2=RightGet(s,no) print(f'右から{no}個の文字を取り出す RightGet-> 入力:{s} 出力:{s2:20} num:{no}') no=3 s2=LeftRemove(s,no) print(f'左から{no}個の文字を消去 LeftRemove-> 入力:{s} 出力:{s2:20} num:{no}') no=3 s2=RightRemove(s,no) print(f'右から{no}個の文字を消去 RightRemove-> 入力:{s} 出力:{s2:20} num:{no}') start=3 no=4 s2=MidGet(s,start,no) print(f'左{start}個目から{no}個を取得 MidGet-> 入力:{s} 出力:{s2:20} start:{start} num:{no}') search='.' s2=RightSearchRemove(s,search) print(f'検索文字列以降を除去 SearchRemoe-> 入力:{s} 出力:{s2:20} search:{search}') search='.' s2=RightSearchGet(s,search) print(f'検索文字列以降を取得 SearchGet-> 入力:{s} 出力:{s2:20} search:{search}') search='.' s2=SeparateSearch(s,search) print(f'検索文字列で分割する SeparateSearch-> 入力:{s} 出力:{s2[0]} {s2[1]} search:{search}') search='.' s2=SearchDelete(s,search) print(f'検索文字列を消去 SearchDeletee-> 入力:{s} 出力:{s2} search:{search}') #■メインプログラム if __name__ == '__main__': test_J809_3() #文字列処理関連まとめ a=input('何かキーを押してください')
メインからtest_J809_3()を呼び出しています。このやり方だと、テストプログラム部分を改良したり、新しいテストプログラムを作るときなど、関数の設定を最初からやらずに済みます。あるいは、自作関数モジュールとして、ファイルを作っておき、インポートするというやり方でもいいかもしれませんね。また、別の記事で自作モジュールの活用の仕方について紹介したいと思います。
このテストプログラムの中にこれまで紹介してきた文字列操作のための関数を使った例が記載されています。
このプログラムを実行した結果が以下のとおりです。
入力文字列:1234567890.abc 左から4個の文字を取り出す LeftGet -> 入力:1234567890.abc 出力:1234 num:4 右から5個の文字を取り出す RightGet-> 入力:1234567890.abc 出力:0.abc num:5 左から3個の文字を消去 LeftRemove-> 入力:1234567890.abc 出力:4567890.abc num:3 右から3個の文字を消去 RightRemove-> 入力:1234567890.abc 出力:1234567890. num:3 左3個目から4個を取得 MidGet-> 入力:1234567890.abc 出力:3456 start:3 num:4 検索文字列以降を除去 SearchRemoe-> 入力:1234567890.abc 出力:1234567890 search:. 検索文字列以降を取得 SearchGet-> 入力:1234567890.abc 出力:abc search:. 検索文字列で分割する SeparateSearch-> 入力:1234567890.abc 出力:1234567890 abc search:. 検索文字列を消去 SearchDeletee-> 入力:1234567890.abc 出力:1234567890abc search:. 何かキーを押してください
テストプログラムを見ると、print(f入力文字列:{s}’)のように
fで始まる文字列を使っているのに気付いた方もいると思います。
これは、format文字列の略称表記で正式には、print(”入力文字列:{}.”format(s))と書きます。
このformat関数の使い方はこちらで詳しく紹介しています。リンク→
コメント