環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Pythonで文字列の含む/含まないを判定する:in、find、rfind、正規表現のsearchの使い方

最終更新日 2023.02.18

Python で文字列が特定の文字列を含むかどうかは in で判定します。

x = 'abc'

if 'a' in x:
    print('x は a を含む')
else:
    print('x は a を含まない')

# x は a を含む

リストが要素を含むかどうかの判定も in を使いましたね。文字列の含む/含まない判定も同様です。Python では次の構文が許されます。

x = 'abc'

y = 'a' in x
z = 'g' in x

print(y)  # True
print(z)  # False

'a' in x という文そのものが True となっています。これは Python の if 文を理解する上で重要かもしれません。

Python の in は小文字と大文字を区別する

x = 'apple'

f = 'A' in x

print(f)  # False

apple は a を含みますが、厳密には A は含みません。in は小文字と大文字を区別するため、上のコードは False となっています。

Python の find 関数は出現文字列のインデックスを返す

Python の find 関数を使うと、「特定の文字列が出てくる位置」を取得できます。

x = 'abc'

f = x.find('a')
g = x.find('b')
h = x.find('c')

print(f)  # 0
print(g)  # 1
print(h)  # 2

a は 最初の文字なので 0 が返ります。同様に c は 2 番目の文字なので 2 が返ります。Python に限らず、だいたいのプログラミング言語は最初のインデックスを 0 とします。

次のコードは find の性質を物語ります。

x = 'apple google'

f = x.find('app')
g = x.find('l')

print(f)  # 0
print(g)  # 3

l (小文字の「エル」)は 2 回出てきますね。しかし find は最初に見つけた文字列のインデックスを返します。つまり apple の l のインデックス 3 を返します。

もし特定の文字列がなかったらどうでしょうか。

x = 'apple google'

f = x.find('b')

print(f)  # -1

文字列がなかったら -1 が返ります。

Python の rfind 関数は右から探索してインデックスを返す

Python の rfind は右から探索します。

x = 'apple google'

f = x.rfind('e')

print(f)  # 11

e は google の e です。この e は 11 番目の文字なので 11 が返っています。

  • find は左から探索する
  • rfind は右から探索する

find と rfind はセットで覚えるといいでしょう。

Python の find と rfind は小文字と大文字を区別する

x = 'apple'

f = x.find('A')
g = x.rfind('A')

print(f)  # -1
print(g)  # -1

in と同じように find も rfind も小文字と大文字を区別します。

Python の正規表現で「文字列を含む/含まない」を判定する

Python の正規表現を使って「含む/含まない」をチェックできます。正規表現は re というパッケージを使います。

import re

x = 'apple'

f = re.search('app', x)
g = re.search('goo', x)

print(f)  # <re.Match object; span=(0, 3), match='app'>
print(g)  # None

apple は app という文字列を含むので re.Match オブジェクトが返っています。しかし goo という文字列は含まないため None が返っています。実際は次のようなコードを書くかもしれません。

import re

x = 'apple'

if re.search('app', x):
    print('x は app を含む')
else:
    print('x は app を含まない')

re.Match オブジェクトは True とみなされます。ところで re.Match オブジェクトを見ると span=(0, 3) とあります。この値は「部分文字列の開始位置と終了位置」です。Python らしく、このオブジェクトからこの値を取り出すことができます。

import re

x = 'apple'
f = re.search('app', x)
print(f)  # <re.Match object; span=(0, 3), match='app'>

print(f.start())  # 0
print(f.end())  # 3
print(f.span())  # (0, 3)

開始位置は start、終了位置は end、範囲は span です。span はタプルです。別の例で同じことをしてみます。

import re

x = 'apple app store'
f = re.search('app', x)
print(f)  # <re.Match object; span=(0, 3), match='app'>

print(f.start())  # 0
print(f.end())  # 3
print(f.span())  # (0, 3)

この例からわかるように、search は最初の部分文字列しか扱いません。apple の後にある app はどうでもいいのです。