Pythonで文字列に「特定の文字列」が含まれているか検索する方法について書いています。
文字列が含まれるか確認する場合には、下記のメソッドや演算子を使います。
・findメソッド
・rfindメソッド
・re.searchメソッド
サンプルコードはPythonのバージョン3.10.5で動作を検証しています。
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になります。
そのため、上記のプログラムの実行結果は「サーモンがない!」を出力して終了します。
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.startメソッド: マッチした文字列の開始位置
・result.endメソッド: マッチした文字列の終了位置
文字列を検索するコードのまとめ
最後に、Pythonで文字列を含むか確認するコードを表にまとめました。
演算子/メソッド | 返り値(見つかった) | 返り値(見つからない) | 備考 |
---|---|---|---|
in演算子 | True | False | 返り値は論理値になる。 |
findメソッド | 文字列の開始位置 | -1 | 文字列を先頭から検索して、最初に見つかった位置を返す。 |
rfindメソッド | 文字列の開始位置 | -1 | 文字列を末尾から検索して、最初に見つかった位置を返す。 |
re.search | matchオブジェクト | None | 正規表現で検索文字列を指定する。見つかった場合はオブジェクトが返ってくる。 |
コメント