Pythonで文字列の含む/含まないを判定する:in、find、rfind、正規表現のsearchの使い方
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 はどうでもいいのです。