Pythonで文字列を検索したいけどどうやれば良いのかわからない
複雑な文字列なのでどうにか検索できないだろうか
文字列の存在や、インデックスも検索したい
Pythonで文字列の検索を行うとき上記のような悩みを抱えている方は多いのでないでしょうか。
こんにちは。Python文字列検索マスターのかいです。本記事は、Pythonで検索を行うときに頭を悩ませている方を対象にさまざまなパターンや、検索方法を解説していきます!
この記事はこんな人のためにかきました。
- Pythonで文字列の検索の知り方を知りたい人
- 文字のインデックスを知りたい人
- 文字の存在を調べたい人
- 複雑な文字列を検索したい人
Pythonでの検索方法についてパターン別に解説していきますのでぜひご覧ください。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
Pythonで検索するには
Pythonには文字列を検索するために、様々な関数が用意されています。基本的に行いたい動作は全て実現できるので諦めずに詳しく見ていただければ幸いです。
Pythonで検索するには基本的に以下の関数を使います。
- find
- in
- count
- re.search
本記事ではこのそれぞれについて実際のコードを示しながら動作確認を行っていくので用途に合わせて確認していただければと思います。
文字のインデックスを知りたいとき
それでは、まずは文字のインデックスを知りたいときの解説からしていきます。文字のインデックスとは具体的に、いうと、”sayhello”という文字列があったとき、”hello”は何番目にくるのだろう、ということですね。
返り値は数値
まず抑えておいて欲しいのは、返り値はインデックスなのでつまり数値として帰ってきます。ここを抑えておかないと後からしたいことがうまく動作しないかもしれないのでしっかり押さえておきましょう。
Pythonで検索を行う上で、返ってくる値はboolかintかオブジェクトです。
findを使おう
さて、それでは実際に文字のインデックスを検索してみます。インデックスの検索にはfindを使います。まずは以下のコードをみてください。
string = "sayhello" print(string.find("hello")) print(type(string.find("hello"))) string = "say hello" print(string.find("hello")) print(string.find("helloooo"))
みてわかるように、findは標準ライブラリなので特にライブラリをインポートすることなく利用できます。それでは実行結果をみてみましょう。
3 <class 'int'> 4 -1
このように、”hello”が3番目から始まるということがわかりますね。返り値がintであることも確認できます。
ここで重要なのは、スペースも一文字としてカウントされるということなので覚えておきましょう。また、最終行からわかるように、文字列が存在しない場合は-1が返ってきます。
余談ですが、インデックスなので0からカウントされます。
rfindを使おう
先ほどは先頭から検索していましたが、rfindを使うと、末尾から文字を検索して一致箇所を探せます。
string = "sayhello" print(string.find("l")) print(string.rfind("l"))
5 6
文字の存在を確かめたいとき
次は、文字列の存在を確かめたいときのコードを見ていきましょう。筆者は一番利用頻度が高いですね。
返り値はbool
存在を確かめるので答えはYes, Noつまり、True or Falseのbool値で返ってきます。数字よりも明示的にTrue Falseがわかるので分岐がさせやすいですね。
inを使おう
存在を確かめるには、in を使います。実際のコードを見てみましょう。
string = "sayhello" print("hello" in string) print(type("hello" in string)) print("l" in string) print("samurai" in string)
True <class 'bool'> True False
このように、返り値がboolであること、文字単体でも検索できることがわかりますね。2回以上検索されてもTrueで返ってきます。
文字の数を数えたいとき
上記のように、文字の存在を確かめた時、何回出現したかということも大切ですよね。ここでは、出現回数をカウントする方法をみていきます。
返り値は数値
こちらも出現回数なので返り値はintです。必要に応じてキャストしましょう。
countを使おう
出現回数をカウントするにはcountを使います。そのままですね。実際に見ていきましょう。
string = "sayhellosayhello" print(string.count("say")) print(type(string.count("say"))) print(string.count("l"))
2 <class 'int'> 4
このように、文字列や文字の出現回数を確認できますね。値がintで返ってきていることも確認できます。
上記で対応できない複雑な文字列を検索するとき
さて、これまでに文字列をインデックスであったり、出現回数であったり、存在であったりを確認してきましたが、シンプルな例でしたよね。情報を処理などしているともっと複雑な検索を強いられることもあります。
最後に複雑な場合の検索方法についてみていきましょう。複雑な場合は正規表現というものを使います。
正規表現とは
正規表現とは、文字列の集合を一つの文字列で表現する方法のことですね。少しわかりにくいですね。
わかりやすくいうと、その文字列がどのような文字パターンで集まっているかを一つの文字列で示すものです。
具体例を挙げてみると、”sayhello”、”mountain”などの文字列は、[a-z]+で表すことができ、”sayhello”、”saygoodnight”、”saygoodmorning”などの文字列は、say…と表すことができます。
正規表現には様々なルールがありそれを学ぶにも少しコストがかかるので詳しくは以下の記事を参考にしてみてください。
返り値はオブジェクト
正規表現を実際にPythonで正規表現を使うときはreというライブラリを用います。正規表現を使って検索をするときは、re.searchを使うのですが、この時は返り値はオブジェクトなので気をつけましょう。
返り値がオブジェクト?ということの説明は次章で行なっていきます。
reを使おう
さて、reを使うには、インポートが必要なので忘れないようにしましょう。実際にコードをみていきます。
import re string = "12sayhello56" obj = re.search(r'[a-z]+', string) print(obj) # マッチした文字列 print(obj.group()) # マッチした文字列の開始インデックス print(obj.start()) # マッチした文字列の終了インデックス print(obj.end()) # マッチした文字列の開始と終了インデックス print(obj.span())
<re.Match object; span=(2, 10), match='sayhello'> sayhello 2 10 (2, 10)
コードを見てわかるように、アルファベットを抽出するという正規表現で文字列の検索を行いました。7行目のプリントから、以下が確認できますよね。
<re.Match object; span=(2, 10), match='sayhello'>
これがオブジェクトでこの中にデータがたくさんつまっています。このオブジェクトから、8行目以降のメソッドを指定してやることで欲しい情報を抜き出すことができます。
代表的なメソッドと、意味はコードのコメントの通りです。
まとめ
いかがでしたでしょうか。Pythonの文字列検索について、様々な方法をみてきました。複雑なものでも、正規表現を用いれば大体の検索は可能です。
正規表現を学ぶのも少しコストがかかりますが、参考リンクなどをみながらマスターし、文字列検索マスターになってくださいね!
それでは!!