Python の文字列演算

Python 3 の文字列型 str に関する基本的な演算についてご紹介します。

以下の例では次の s1 s2 を使います。

s1 = 'hello'
s2 = 'world'

連結

+ は文字列を連結します。

s1 + s2  # => 'helloworld'

* は文字列を繰り返します。

s1 * 3   # => 'hellohellohello'

比較

== != < > 等を使って文字列を比較することができます。

# 2 つの文字列が一致するかどうかをチェック
s1 == s2  # False
# 2 つの文字列が異なるかどうかをチェック
s1 != s2  # True
# 2 つの文字列の辞書上の順序を比較
s1 < s2  # True

<> は辞書上の比較です。実際にこれらを使う機会はそう多くないと思います。

'a' < 'ab'    # True
'aa' < 'b'    # True
'a-a' < 'aa'  # True

特定の文字が含まれているかどうかのチェック

文字列中に特定の文字列が含まれているかどうかのチェックは in 演算子で行えます。

'h' in 'hello'    # True
'hel' in 'hello'  # True

'hi' in 'hello'   # False

直感的です。

インデックス・スライス

文字列の一部を取り出す処理――インデックスやスライスは [] で行えます。インデックスは 1 ではなく 0 で始まります。

s1[0]  # => h
s1[1]  # => e
s1[2]  # => l

マイナスのインデックスを使用すると、文字列の末尾から取り出すことができます。 -1 が一番後ろの文字になります。

s1[-1]  # => o
s1[-2]  # => l
s1[-3]  # => l
s1[-4]  # => e
s1[-5]  # => h

スライス(サブストリング取り出し)は、 [] を使って s1[begin:end] という形で行えます。

s1[1:4]  # => ell
s2[0:4]  # => worl

s1[begin:end] とすると、 s1[begin] で始まり end - begin 個の文字を抜き出すことになります。 s1[end] の文字は含まれません。

スライスにおいても、マイナスのインデックスを使うことができます。

s1[1:-1]  # => ell
s2[0:-2]  # => wor

スライスの始まりと終わりのインデックスは省略することができます。始まりを省略したときは先頭から、末尾を省略したときは末尾までの文字列を返します。

# start を省略した場合
s1[:-1]  # => hell

# end を省略した場合
s2[1:]   # => orld

# 両方を省略した場合
s1[:]    # => hello

文字列の長さを越えるインデックスを指定した場合、単一文字の取り出しではエラーが発生します。スライスの場合はエラーは発生しません。

s1[100]      # IndexError
s1[100:105]  # => ''

スライスで 3 つめの値を指定すると s1[begin:end:skip] とすると、間を飛ばしながらスライスすることも可能です。

s2[0:5:2]  # => wrd

文字列そのものの評価

文字列を if 文で評価すると、文字列が空の場合のみ False を、それ以外は True を返します。

if 'hello':
    print('true')
else:
    print('false')
# => 'true'
if '':
    print('true')
else:
    print('false')
# => 'false'

その他のよく使う文字列関連の関数・メソッド

他にも、文字列に対して使える関数やメソッドが豊富に用意されています。

文字列の長さは len() 関数で取得できます。

len(s1)  # => 5
s1.count(s2)  # s1 中に文字列 s2 が現れる回数
s1.encode(encoding)  # s1 を指定された文字コードのバイト列に変換
s1.find(s2)  # s1 の中に文字列 s2 があればその最初のインデックス
s1.rfind(s2)  # s1 の中に文字列 s2 があればその最後のインデックス
s1.index(s2)  # s1 の中に文字列 s2 があればその最初のインデックス

find()index() のちがいは、文字列 s2 がなかったときの挙動です。 find() は文字列 s2 がなかったときは -1 を返しますが、 index()ValueError というエラーを返します。

文字列を分割するには split() または partition() を使います。

s1.split(s2)      # s1 を文字列 s2 で分割したリスト
s1.partition(s2)  # s1 を文字列 s2 で分割したリスト

split()partition() のちがいは、 split() が返すリストの要素に s2 を含まないのに対して、 partition()s2 を含む点です。

'world'.split('o')
# => ['w', 'rld']

'world'.partition('o')
# => ('w', 'o', 'rld')

参考

公式のドキュメントにはその他数多くのメソッドの使い方が載っています。