クラスstrによるテキスト処理

strの持つ色々なメソッド

組み込み型の文字列str (テキストシーケンス型) は、文字列を操作するために色々なメソッドが用意されています。ここでは、すべてを説明できませんが、特徴的なものを取り上げて理解を深めます。ここで紹介する以外にもたくさんのメソッドがありますので詳しくは、pythonのオンラインマニュアルを参照してください。

ここで理解してもらいたいのは、オブジェクト指向言語であるpythonは、クラス(タイプ)には色々な処理(メソッド)が用意されているということです。その例として、ここではこれまでも使ってきたstrのメソッドの一部を紹介してみます。

初期化とメソッドの呼び出し方

strsample.py

# File: strsample.py
## pythonにおけるテキスト処理


## 文字列 (テキストシーケンス型)の操作
# https://docs.python.org/ja/3/library/stdtypes.html#text-sequence-type-str

## 初期化
s0='abcdABCD'                   # 文字列の初期化
s1=str('abcdABCD')              # strタイプとして明示的に初期化

# 文字列のメソッドの使い方
s0.capitalize()                 # 頭のみ大文字
s0.casefold()                   # 小文字に変換
s0.count('a')                   # 'a'がいくつ含まれるかカウント
s0.count('dA')                  # 'dA'がいくつ含まれるかカウント
s0.casefold().count('a')        # すべて小文字に変換した後に'a'をカウント

変数s1では初期化ではクラスstrを明示的に利用してデータを与えて、インスタンスを生成し変数に与えています。メソッドはインスタンス変数に続き’.’でつなげます。メソッドを連続してつなげることも出来ます。

utf-8のエンコード・デコード

# 日本語のeocode/decode
s2='日本語文字列'
bs2=s2.encode(encoding='utf-8') # 日本語文字列(utf-8)をバイト列に変換
s3=bs2.decode(encoding='utf-8') # バイト列を日本語文字列 (utf-8)に変換
print(s2 == s3)                 # 中身が同じか
print(id(s2) == id(s3))         # オブジェクトが同じか

まず、python(バージョン3)を日本語環境で利用する場合、デフォルトでutf-8になっている前提で説明することを念頭に入れてください。それ以外ではうまく動作しない可能性があります。

変数s2には’日本語文字列’という文字列が入っています。encode(encoding=エンコード種類)で指定すると、その指定したエンコード種類からバイト列データに変換します。そのバイト列コード (byteタイプ)に、今度はutf-8でデコードを行うと元の文字列(この場合はutf-8の文字列)に戻ります。

最後、中身が同じかどうか、オブジェクトが同じかどうかを比較演算子 == で確認しています。前者はTrue、後者はFalseが表示されるはずです。

文字列中の文字をみつける

# 文字列中の文字をみつける
s4='abcdABCDabcdABCD'
s4.find('AB')                   # 文字'AB'が現れた先頭の場所
s4.index('AB')                  # 文字'AB'が現れた先頭の場所
s4.rfind('AB')                  # 文字'AB'が現れた最後の場所(逆から探す)
s4.rindex('AB')                 # 文字'AB'が現れた最後の場所(逆から探す)

文字列中に同じ文字(列)があるか探すのにはfind()もしくはindex()を使います。先頭から探して、文字(列)が現れた場所のポジションが返却されます。rfind()とrindex()が文字列の最後尾から探して現れた場所のポジションが返却されます。このように反対側(リバーズ側)から処理を行うようなメソッドには慣用的に先頭に’r’をつけるのが多いようです。

あるパターンの文字列をみつけるためには正規表現が必要ですが、これに関しては後に説明します。

文字の置き換え

# 文字の置き換え
s4='abcdABCDabcdABCD'
s4x=s4.replace('a','x')         # aをxに置換する
s4xyz=s4.replace('abc','xyz')   # abcをxyzに置換する

replace()は、その名前から想像つくかと思いますが、1番目の引数の文字(列)をを2番目の引数の文字(列)に置換します。

あるパターンの文字列をみつけ置換するためには正規表現が必要ですが、これに関しても後に説明します。

文字のフォーマット

# 文字のフォーマット
s5="1と2を足すと{0}になります。".format(1+2)
print(s5)
a=10
b=20
s5x="{0}{1}を足すと{2}になります。".format(a,b,a+b)
print(s5x)
s5y="{0}{1}で割ると{2:.1f}になります。".format(a,b,a/b)
print(s5y)

変数の値などを文字列にフォーマットを指定して取り込みたい時に使います。このフォーマットの指定方法は色々な表現ができますが、これに関してはpythonのオンラインマニュアルのサンプルコードを参照してください。

文字の並び (項目)の分割

# 文字の並びの分割
s6a='Item0 Item1 Item2'         # ワードとワードの間が空白で区切られている
s6a1=s6a.split()                # リストになったデータが返却される
s6b='項目0,項目1,項目2'           # ワードとワードがカンマ(,)で区切られている
s6b1=s6b.split(',')             # 区切りにカンマ(,)を指定する

項目が並んでいる文字列を分割してリストにするにはsplit()を使います。スプレットシートなどのように項目ごとにならんでいるようなデータ (である文字列)に対してsplit()をすると、1つ1つがリストの項目になって戻ってきます。

特にスプレットシートのテキスト用テーブルフォーマットであるCVS (Comma Separated Values / カンマ区切り値)のようなカンマ(,)で区切られているデータを読み込みデータとして処理する時に非常に有用です。

前後の余分な文字を削除

# 文字の除去
s7='文字列\n'                # 行末に改行コード\nがついている
print(s7.strip())             # 行末の改行コードをストリップ(取り去る)
s7x=' ,文字列, '             # 前もしくは後ろの余計な文字を処理する
print(s7x.strip(', '))        # カンマと空白をストリップ(取り去る)

行の前後に余分な空白などがついている場合などがわりと多くあります。そのような時に邪魔な文字列をストリップ(取り去る)します。そのままテキストを読み込んで来たとき、テキストの行末には改行コードが含まれています。これを取り去る時に使うのに便利です。また、文字を指定して、前後の余分な文字をストリップすることもできます。


トップページ