Pythonで文字列が含むか検索する4つの方法!

PythonPython

Pythonで文字列に「特定の文字列」が含まれているか検索する方法について書いています。
文字列が含まれるか確認する場合には、下記のメソッドや演算子を使います。

・in演算子
・findメソッド
・rfindメソッド
・re.searchメソッド

サンプルコードはPythonのバージョン3.10.5で動作を検証しています。

PR

in演算子を使って、含まれるか確認する

in演算子を使うことで、文字列に「特定の文字列」が含まれるか確認することができます。
例えば、下記のように使います。

fruitText = 'banana grape apple orange'
searchText = 'apple'

if searchText in fruitText:
    print("りんご有り")
else:
    print("りんご無し")

最初にfruitText変数に文字列「banana grape apple orange」を代入しています。
その後に、fruitTextに入れた文字列から探す文字列(apple)をsearchText変数に代入しました。

if文を使っている箇所で、in演算子を使用しています。
上記のように、「探したい文字列 in 検索元文字列」とすることで、fruitText変数に入っている文字列から、searchText変数の文字列を探します。
結果、「apple」はfruitText変数に入っているので、print関数で「りんご有り」のみが出力されて処理が終了します。

大文字と小文字は区別する

大文字と小文字は区別されて、処理されます。
例えば、先ほどのプログラムのsearchText変数を大文字の「Apple」に変えると、Falseになります。

fruitText = 'banana grape apple orange'
searchText = 'Apple'

if searchText in fruitText:
    print("りんご有り")
else:
    print("りんご無し")

上記のようにsearchText変数を大文字にすると、fruitText変数に含まれないことになります。
結果、「りんご無し」のみが出力されて処理が終了します。

検索元がNoneの場合は例外が発生する

検索元の文字列がNoneの場合は、例外が発生するので注意が必要です。
例えば、このように検索元がNoneの場合です。

if "test" in None:
    print("hoge")

実行すると、下記のようにTypeErrorが発生します。
TypeError: argument of type 'NoneType' is not iterable

含まれない場合を判定したいとき

含まれない場合を判定したい場合には、not inを使用することが可能です。
例えば、下記のように使います。

text = 'はまち マグロ たまご いか ホタテ たこ'
if 'サーモン' not in text:
    print('サーモンがない!')
else:
    print('サーモン美味しい')

text変数に寿司ネタの文字列「はまち マグロ たまご いか ホタテ たこ」を代入しました。
if文でtext変数に「サーモン」が含まれていないか判定しています。

not inを使っているので、含まれない場合にTrueになります。
そのため、上記のプログラムの実行結果は「サーモンがない!」を出力して終了します。

PR

findを使って、含まれるか確認する

findメソッドを使うことでも、文字列に指定文字列が含まれているか確認できます。
findメソッドは、文字列から呼び出して使うことができます。

例えば、下記のように使うことができます。

text = '庭には、2羽、鶏がいる'
searchText = '鶏'

if text.find(searchText) != -1:
    print("鶏あり");
else:
    print("鶏なし");

text変数に検索元の文字列「庭には、2羽、鶏がいる」を代入しています。
searchText変数には、検索する文字「鶏」を入れました。

if文の箇所で、text変数からfindメソッドを呼び出して使っています。
検索したい文字列を入れると、検索元文字列の開始位置を返してくれます。

検索元文字列に、検索する文字がなかった場合に-1を返します。
そのため、-1以外だったら文字列が見つかったということになります。

今回は検索元文字列に「鶏」が入っているので、文字列の位置「7」が返ってきます。(文字列は先頭を0から数えます。)
結果、-1ではないので「鶏あり」が出力されて処理が終了します。

複数の検索対象文字列がある場合は?

複数の検索対象文字列がある場合は、検索元文字列を左から見ていって、初めに見つかった位置を返します。
例えば、下記のような場合です。

text = 'banana apple orange apple grape apple'
searchText = 'apple'
print(text.find(searchText)) # 7

最初にtext変数(検索元文字列)に「banana apple orange apple grape apple」を代入しています。
searchText変数(検索する文字列)に「apple」を代入しています。

findメソッドでtext変数の「apple」の位置を確認しました。
apple」は複数ありますが、print関数で確認すると、最初に見つかった文字列位置の「7」が返ってきました。

findメソッドの挙動まとめ

findメソッドを使用した場合の挙動をまとめます。

・文字列から呼び出すことができる。
・引数に探したい文字列を渡す。
・「検索元の文字列」に「探したい文字列」が見つからない場合に`-1`を返す。
・左から見ていって、一番最初に見つかった位置を返す。

rfindメソッドを使って、含まれるか確認する

rfindメソッドも、文字列から呼び出して使うことが可能です。

findメソッドでは、文字列の左から見ていって、一番最初に見つかった位置を返しました。
rfindメソッドでは、文字列の右から見ていって、一番最初に見つかった位置を返します。

例えば、下記のように使います。

text = 'banana apple orange apple grape apple'
searchText = 'apple'
print(text.rfind(searchText)) # 32

先ほどのfindメソッドのサンプルコードの一部をrfindに変えました。
findメソッドでは、左から探してきますが、rfindメソッドは右から見つかった位置を返します。

右から見つかった位置を返しますが、開始位置は文字列の先頭から数えて返します。
結果、最後の「apple」の開始位置の「32」が返ってきます。

rfindメソッドも見つからなかった場合は、「-1」が返ってきます。

re.searchメソッドを使って、含まれるか確認する

reモジュールのsearchメソッドでも、検索元文字列に検索文字列が含まれているか確認できます。
検索する文字列には、正規表現を指定して探すことが可能です。
例えば、下記のように使うことができます。

import re

text = 'apple grape 123 orange'
result = re.search(r'[0-9]', text)

if result == None:
    print("見つかりませんでした。");
else:
    print(result) # <re.Match object; span=(12, 13), match='1'>
    print(result.group()) # 1
    print(result.start()) # 12
    print(result.end()) #13

最初にreモジュールをimportしました。
その後に、text変数に検索元の文字列「apple grape 123 orange」を代入しています。

その次に、result変数に対して、re.searchメソッドを使った結果を代入しています。
re.searchメソッドの第1引数には、検索元文字列を探すときの正規表現を指定しています。
第2引数には、検索元文字列を指定します。

今回は正規表現箇所を[0-9]としているので、文字列の中で数値の箇所を探してきます。

re.searchで見つかった場合には、matchオブジェクトが返ってきます。
見つからなかった場合には、Noneが返ってきます。

if文の箇所で、検索した結果を比較しています。Noneの場合は「見つかりませんでした」を出力します。
今回は存在するので、elseの処理を通ります。

result変数を出力すると、下記のようにmatchオブジェクトが返ってきています。
<re.Match object; span=(12, 13), match='1'>

matchオブジェクトのメソッドを呼び出すことにより、見つかった場合の検索元文字列の情報を取得できます。

・result.groupメソッド: 正規表現にマッチした文字列
・result.startメソッド: マッチした文字列の開始位置
・result.endメソッド: マッチした文字列の終了位置

文字列を検索するコードのまとめ

最後に、Pythonで文字列を含むか確認するコードを表にまとめました。

演算子/メソッド返り値(見つかった)返り値(見つからない)備考
in演算子TrueFalse返り値は論理値になる。
findメソッド文字列の開始位置-1文字列を先頭から検索して、最初に見つかった位置を返す。
rfindメソッド文字列の開始位置-1文字列を末尾から検索して、最初に見つかった位置を返す。
re.searchmatchオブジェクトNone正規表現で検索文字列を指定する。見つかった場合はオブジェクトが返ってくる。

コメント

タイトルとURLをコピーしました