ある文字列が部分文字列として含まれているか、またその位置を知りたい場合は、
- 存在しているかどうかを確認する場合はin/not in演算子
- 存在場所(インデックス)も取得するならfindメソッド、正規表現(re.search().span())
を用いることができます。
今回は、文字列を検索する方法についてまとめます。
確認した環境
- OS: Ubuntu 16.04LTS
- Python3.7.4
存在するかどうかを確認(in/not in演算子)
検索したい文字(列)があるかどうかを確認するには、inまたはnot in演算子 を使うのが簡単です。
具体的な例を以下に示します。
# 検索対象の文字列
>>> s = 'one-two-three-four'
# in演算子の場合
>>> 'two' in s
True
>>> 'five' in s
False
# not in演算子の場合
>>> 'five' not in s
True
>>> 'two' not in s
False
参考記事)【Python】 in 演算子 /not in 演算子の使いかた
どこにあるかを前から確認(find)
文字列のメソッドfind()は、検索したい文字列を左から検索して最初にマッチした位置のインデックスを返します。
使い方は以下です。
str.find(sub[, start[, end]])
- 文字列strに部分文字列subが含まれる場合、その位置の最小のインデックスを返します。
- 検索される文字列strは引数start, endで範囲を指定可能。省略された場合は文字列全体となります。
- start, endはスライス表記と同様
- 部分文字列subが見つからなかった場合は-1を返します。
>>> s = 'one-two-three-two-one'
# 部分文字列の位置を取得
>>> s.find('two')
4
# 見つからない場合は-1を返す
>>> s.find('five')
-1
どこにあるかを後ろから確認(rfind)
後ろから(データの右側から)検索する場合は、文字列のメソッドrfind() を使います。
使い方は以下です。
str.rfind(sub[, start[, end]])
- 文字列strに部分文字列subが含まれる場合、その位置の最大のインデックスを返します。
- 検索される文字列strは引数start, endで範囲を指定可能。省略された場合は文字列全体となります。
- start, endはスライス表記と同様
- 部分文字列subが見つからなかった場合は-1を返します。
例を以下に示します。
>>> s = 'one-two-three-two-one'
# 部分文字列の位置を取得
>>> s.rfind('two')
14
# 見つからない場合は-1を返す
>>> s.rfind('five')
-1
正規表現を使った文字列検索(re.search、re.findall)
正規表現を使うと、特定の文字列だけでなく様々なパターンの文字列を検索することが出来ます。
特定の文字列の位置を取得する
re.search().span() を使います。ヒットした文字列の位置のインデックスがタプル形式(start, end)で返ります。
>>> s = 'one-two-three-two-one'
# reモジュールをインポート
>>> import re
# 'two'にマッチした結果をマッチオブジェクトで返す
>>> re.search(r'two', s)
<re.Match object; span=(4, 7), match='two'>
# span()メソッドを使うと、位置が返ります。
>>> re.search(r'\w{3}', s).span()
(0, 3)
正規表現パターンで表された文字列を抽出する
検索する文字列を正規表現のシンタックス に則り設定します。
下記は、文字列が3つ連続で並んでいるパターンを抽出する例です。この場合は、例えばr”\w{3}”と書けます。
>>> s = 'one-two-three-two-one'
# reモジュールをインポート
>>> import re
# マッチした結果全てをリストで返す
>>> re.findall(r'\w{3}', s)
['one', 'two', 'thr', 'two', 'one']
参考記事)
まとめ
今回は、文字列の検索方法について、2つについてまとめました。
- 存在しているかどうかを確認する場合はin演算子、
- 存在場所(インデックス)も取得するならfind、正規表現(re.search, re.findall)