Pythonで文字列を検索する
Pythonは、文字列を検索するための演算子や関数など検索機能を用意しています。汎用プログラミング言語として数値演算に強みを持ちますが、文字列でも多くの事を簡単に実装することができます。
ここでは、手軽に使える比較演算子や文字列のメソッド、正規表現操作などについて学んでいきます。
Pythonの比較演算子「in」の使い方
比較演算子「in」は、リスト・タプル・集合・凍結集合・辞書などの要素に含まれているか、TrueあるいはFalseで結果を返します。ここでは、任意の文字列に対して指定する文字列を含むか「in」で結果を得られます。条件分岐などの判定に結果を用いることができます。
次の例は、文字列 ”Hello World!”に対して、”World”、”Japan”、”Hello”および”World”が含まれるか結果を表示するサンプルコードです。
str='Hello World!'
print('Strings pattern: World =','World' in str)
print('Strings pattern: Japan =', 'Japan' in str)
print('Strings pattern: Hello World =','Hello' in str and 'World' in str)
実行結果は以下の通りです。
Strings pattern: World = True
Strings pattern: Japan = False
Strings pattern: Hello World = True
【参考】:Python Docs: 比較 【参考】:Python Docs: 所属検査演算
Pythonの比較演算子「not in」の使い方
比較演算子「not in」は、「in」の論理値を反転したものです。TrueとFalseが反転します。次の例は、比較演算子「in」で使用したコードを使用し、さらに”Hi”および”Japan”が含まれていないかどうかを追加したものです。条件分岐で除外するための判定を行います。
str='Hello World!'
print('Strings pattern: World =','World' not in str)
print('Strings pattern: Japan =', 'Japan' not in str)
print('Strings pattern: Hello World =','Hello' not in str and 'World' not in str)
print('Strings pattern: Hi Japan =','Hi' not in str and 'Japan' not in str)
実行結果は、以下の通りです。
Strings pattern: World = False
Strings pattern: Japan = True
Strings pattern: Hello World = False
Strings pattern: Hi Japan = True
【参考】:Python Docs: 比較 【参考】:Python Docs: 所属検査演算
Pythonの文字列メソッドを用いて文字列を検索する
Pythonでは、文字列を検索するメソッドをいくつか用意しています。「in」や「not in」比較演算子で不足する部分は、メソッドを用いて実装することができます。ここでは、count()やfind()、rfind()の使い方を学んでいきます。
【参考】:Python Docs: 文字列メソッド
文字列の出現回数をカウントする
count()メソッドは、指定した文字列がいくつ含まれているか個数をカウントします。該当がない場合は、”0”が戻ります。個数を数える目的の他に検索機能としても利用することができます。使い方は、次の通りです。
str='Hello World of the World!'
print('count of World =', str.count('World'))
print('count of Japan =', str.count('Japan'))
実行結果は以下の通りです。
count of World = 2
count of Japan = 0
【参考】:Python Docs:
find()メソッドの使い方
find()メソッドは、指定した部分文字列が存在する場合に最初に現れたインデックス値(最小インデックス)を返します。指定した文字列が存在しない場合は -1を返します。比較するために、文字列中に”World”という単語を2回入れてみました。
str='Hello World of the World!'
print('Index of World =', str.find('World'))
print('Index of Japan =', str.find('Japan'))
print('Index of Hello World =', str.find('Hello World'))
実行結果は以下の通りです。”World”の検索結果には最初のインデックス番号が戻っています。文字列が存在しない”Japan”の場合は -1が返ります。
Index of World = 6
Index of Japan = -1
Index of Hello World = 0
rfind()メソッドの使い方
rfind()メソッドは、指定した部分文字列が存在する場合に最後に現れたインデックス値(最大インデックス)を返します。指定した文字列が存在しない場合は -1を返します。ここでは比較のために、文字列中に”World”という単語を2回入れています。
str='Hello World of the World!'
print('Index of World =', str.rfind('World'))
print('Index of Japan =', str.rfind('Japan'))
print('Index of Hello World =', str.rfind('Hello World'))
実行結果は以下の通りです。”World”の検索結果は最後のインデックス番号の値が戻ったことが分かります。
Index of World = 19
Index of Japan = -1
Index of Hello World = 0
Pythonの正規表現操作を用いて文字列を検索する
これまでに、文字列の検索を学んできました。検索する文字列がある条件に従うものすべてを抽出するなどの場合には、正規表現が有効です。正規表現によって、類似する文字列を検索したり、誤りを見つけたりなどが可能になります。
ここでは、re.search()関数とre.findall()関数について解説していきます。
【参考】:Python Docs: 正規表現操作
re.search()関数の使い方
re.search()関数は、正規表現のパターンを用いて文字列全体を検索します。正規表現のメリットは、文字列がすべて特定できていない場合も検索できることです。
次の例は、”W”で始まり、”d”で終わる文字列を検索する例です。正規表現が使えない場合は、”World”などと特定して検索を行っていましたが、あいまい検索として文字数の指定も柔軟に行えます。
例えば3文字以上の”W”で始まり、”d”で終わる文字列は”W.*d”、5文字の”W”で始まり、”d”で終わる文字列は”W...d”などのように指定します。
import re
str='Hello World of the World!'
print('Results of World =', re.search('W.*d',str))
print('Results of World =', re.search('W...d',str))
実行結果は以下の通りです。
Results of World = <re.Match object; span=(6, 24), match='World of the World'>
Results of World = <re.Match object; span=(6, 11), match='World'>
re.findall()関数の使い方
re.findall()関数は、すべての該当文字列を検索し、文字列を戻します。re.search()関数ではオブジェクト情報を表示することができますが、re.findall()関数ではパターンマッチした文字列情報のみが戻ります。
import re
str='Hello World of the World!'
print('Results of World =', re.findall('W.*d',str))
print('Results of World =', re.findall('W...d',str))
実行結果は以下の通りです。
Results of World = ['World of the World']
Results of World = ['World', 'World']
【参考】:Python Docs: re.findall()
Pythonの検索機能は十分に活用できます
Pythonは、検索機能として文字列を扱うことが簡単にできます。標準機能でシンプルな検索エンジンなども実装することができます。ベースとなる文字列のメソッドや正規表現操作を組み合わせて、あいまい検索などにも対応できます。
この機会に、Pythonの検索機能の基本をマスターして色々な用途に活用しましょう。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから