Python
基本データ型
文字列
検索

Python 文字列検索: 正規表現, 後ろから, 複数, 大文字小文字, count, find() index() 関数

この投稿では、Pythonで文字列を検索する方法についてよくある質問を集めました。

1. find() 関数を使って特定の文字列の場所を見つける

Pythonで文字列を見つけるために使われる最も基本的な関数の1つが find() 関数です。 この関数は文字列の中から指定された文字列を見つけ、その位置を返します。 文字列が存在しない場合は -1 を返します。

s = "Hello, Python!"
 
print(s.find("Python")) # Output: 7

上の例では、文字列 "Python""Hello, Python!" のどこで始まるかを見つけることができます。 この場合、文字列 "Python" はインデックス 7 から始まることを意味する 7 が返されます。

デフォルトでは、find()関数は探している文字列が最初に現れるインデックスの値を返します。複数の文字列を検索する場合は、セクション4を参照してください。

この関数はオプションでさらに2つの引数を取ることができます: それぞれ以下のように使用できます。

s = "Hello, Python! Python is great."
 
print(s.find("Python")) # Output: 7
print(s.find("Python", 10)) # Output: 15
print(s.find("Python", 0, 15)) # Output: 7

上の例では、2番目の print 文は find() 関数が開始インデックスを受け取ったときの動作を示しています。 これはインデックス 10 から始まるので、文字列 s[10:]つまり"hon! Python is great." の位置を見つけるのと同じです

同様に、例の3番目の print ステートメントは終了インデックスまで取り、 s[0:15] でスライスされた部分文字列の位置を見つけることと同じです。

特定の文字列の最後のインデックスを見つけたい場合は、同じ原理で動作する rfind() 関数を使うことができます。 この関数は文字列の末尾から検索するので、特定の文字列が現れる最後のインデックスを見つけることができます。 index()関数に対応する rindex() 関数も存在することに注意してください。 index()関数についてはセクション2で説明します。

1.1. 大文字小文字を区別しない検索

Python String Comparison の投稿で見たように、Python String クラスの __eq__() メソッドは Unicode コード値を比較するので大文字小文字を区別します。 もし find() 関数を使って大文字小文字を区別しない文字列の位置を見つけたい場合は、 upper() メソッドか lower() メソッドを使う必要があります。

以下のコードでは、大文字小文字を区別しない検索のために、見つかった文字列と見つかった文字列の両方を小文字に変換しています。

s = "Hello, Python!"
s.lower().find("python".lower()) # Output: 7

2. find()関数とindex()関数の違い

find()関数とindex()関数は、どちらも文字列内の特定の部分文字列を検索するためのメソッドです。 検索が成功すれば、2つのメソッドに違いはありません。 しかし、検索に失敗した場合は、2つのメソッドの違いが明らかになります。

探している文字列が検索対象に存在しない場合、 find() 関数は -1 という値を返し、例外をスローしません。 しかし、同じ状況で index() 関数は ValueError 例外がスローされます。

>>> s = "Hello, Python!"
>>> s.index("python")
Traceback (most recent call last):
File "", line 1, in
ValueError: substring not found

したがって、Pythonの文字列が見つからないときに何をしたいかによって、 2つの方法のうち適切な方を選んで使うことが重要です。

3. 指定した数の文字列を見つける

Pythonで文字列の特定の数を見つけるために使うメソッドは count() です。 このメソッドは、指定した部分文字列が対象の文字列の中で何回出現するかをカウントして返します。 オプションとして、 find() メソッドや index() メソッドと同様に、検索を開始したり終了したりするインデックスを指定することもできます。

基本的な使い方は

s = "Hello, Python! Python is great."
 
print(s.count("Python")) # Output: 2
print(s.count("Python", 2, 14)) # Output: 1

上のコードの最初の print 文は "Python" という文字列の出現回数を表示します。この場合は 2 を返します。

2番目の print 文は開始インデックスと終了インデックスを取り、それに基づいて異なる値を返します。

このように、 count() メソッドは文字列内の特定の部分文字列の出現頻度を素早く求めるのに便利で、文字列解析が必要な様々な場面で使用できます。

4. 文字列の全出現回数を見つける

Pythonで文字列の出現回数をすべて見つけるには、主に3つの方法があります。 1つ目は find() 関数を使う方法で、残りの2つは正規表現 re モジュールを使う方法です。

4.1. find() 関数を使った複数の文字列の検索

セクション1で述べたように、Pythonのfind()関数は部分文字列の最初に現れる文字列のインデックスを返すだけです。 したがって、複数の文字列の位置を見つけるにはループと組み合わせて使用する必要があります。

これを実装する方法はいろいろありますが、ここでは最も簡単な実装コードを見てみましょう。

s = "Hello, Python! Python is great."
 
start = 0
while start != -1:
    start = s.find("Python", start)
    if start != -1:
        print(start)
        start += 1

上記のコードは find() 関数が引数として取る開始インデックスと、検索に失敗した場合に返す値 -1 を使って複数の文字列位置を取得します。

4.2. re.finditer() 関数で複数の文字列の位置を取得する

Python の re モジュールは、直感的なパターンとメソッドで強力な正規表現を利用するためのライブラリです。

reモジュールの関数のうち、finditer() 関数は与えられたパターンにマッチする全てのオブジェクトの反復可能なリストを返します。 これは複数の文字列の位置を検索するときに便利です。 位置インデックスはマッチングオブジェクトの .start() メソッドを使って取得します。

その使い方は以下の通りです

import re
 
s = "Hello, Python! Python is great."
matches = re.finditer("Python", s)
indices = [match.start() for match in matches]
 
print(indices) # 출력: [7, 15]

上記のようなリスト内包など、様々な使い方ができる。

5. まとめ

この記事では、Pythonで文字列を検索する4つの異なる方法を取り上げました。 Pythonは文字列操作を強力にサポートしているので、様々な方法で部分文字列を検索することができました。 この記事があなたの実際のプロジェクトで役に立てば幸いです。

copyright for Python string find

© 2023 All rights reserved.