文字列内の部分文字列の最後の出現のインデックスを見つける


347

特定の入力文字列で特定の部分文字列が最後に出現する位置(またはインデックス)を検索したいstr

たとえば、入力文字列がstr = 'hello'で、部分文字列がtarget = 'l' 3が出力されます。

これどうやってするの?

回答:


600

使用.rfind()

>>> s = 'hello'
>>> s.rfind('l')
3

またstr、変数名として使用しないでください。使用すると、組み込みがシャドウされstr()ます。


7
+1をチップがstr変数名として使用しないようにします。Pythonで避けるべきもう1つの変数名はabcです。abcネイティブAPIで呼び出されるモジュールがあります。
progyammer

80

rfind()またはPython2リンクを使用できます。rindex()
rfind() rindex()

>>> s = 'Hello StackOverflow Hi everybody'

>>> print( s.rfind('H') )
20

>>> print( s.rindex('H') )
20

>>> print( s.rfind('other') )
-1

>>> print( s.rindex('other') )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

サブストリングが見つからなかった場合に違いがあり、rfind()戻り-1ながらrindex()例外発生させValueError(Python2リンクを:ValueError)。

rfind()リターンコードを確認したくない場合は、わかりやすいエラーメッセージを表示する-1ことrindex()をお勧めします。それ以外の場合、予期しない値-1がコード内から発生している分を検索できます...


例:最後の改行文字の検索

>>> txt = '''first line
... second line
... third line'''

>>> txt.rfind('\n')
22

>>> txt.rindex('\n')
22

こんにちは@JacobSchneider。コメントに応じて例を追加しました。私はあなたの問題を理解していません。詳細情報を提供してください:Pythonバージョン、文字列の内容...乾杯
olibre

39

str.rindexメソッドを使用します。

>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2

5

これを試して:

s = 'hello plombier pantin'
print (s.find('p'))
6
print (s.index('p'))
6
print (s.rindex('p'))
15
print (s.rfind('p'))

3

more_itertoolsすべてのインデックス検索するためのライブラリの提供のツールを文字またはすべてのサブストリングを

与えられた

import more_itertools as mit


s = "hello"
pred = lambda x: x == "l"

コード

キャラクター

今、rlocate利用可能なツールがあります:

next(mit.rlocate(s, pred))
# 3

補完的なツールはlocate次のとおりです。

list(mit.locate(s, pred))[-1]
# 3

mit.last(mit.locate(s, pred))
# 3

部分文字列

またwindow_size、いくつかのアイテムの先頭のアイテムを見つけるために使用できるパラメーターもあります。

s = "How much wood would a woodchuck chuck if a woodchuck could chuck wood?"
substring = "chuck"
pred = lambda *args: args == tuple(substring)

next(mit.rlocate(s, pred=pred, window_size=len(substring)))
# 59

2

非アクティブな投稿を復活させようとはしていませんが、まだ投稿されていないため...

(これはこの質問を見つける前に私がやった方法です)

s = "hello"
target = "l"
last_pos = len(s) - 1 - s[::-1].index(target)

説明:最後のオカレンスを検索しているとき、実際には、逆のストリング内の最初のオカレンスを検索しています。これを知って、私はそうしましたs[::-1](逆の文字列を返します)、そしてtargetそこからインデックスを付けました。それlen(s) - 1 - the index foundから、元に戻されていない(つまり元の)文字列のインデックスが必要なためです。

でも気をつけて!場合targetより1つの文字よりも、あなたはおそらく逆の文字列でそれを見つけることができません。これを修正するには、を使用しますlast_pos = len(s) - 1 - s[::-1].index(target[::-1])。これは、の逆のバージョンを検索しtargetます。


1
元の質問にはあまり役に立ちませんでしたが、一般的に興味深く、教育的だったので、私はこの回答に賛成しました。Pythonの学習の大部分はこのようなものだと思います。
Bill Evans、マリポサ

@BillEvansatMariposa感謝:)
Adi219

1

rfindを使用したくない場合は、これでうまくいきます/

def find_last(s, t):
    last_pos = -1
    while True:
        pos = s.find(t, last_pos + 1)
        if pos == -1:
            return last_pos
        else:
            last_pos = pos


0

Python String rindex()メソッド

説明
Python文字列メソッドrindex()は、部分文字列strが見つかった最後のインデックスを返すか、そのようなインデックスが存在しない場合は例外を発生させ、オプションで検索をstring [beg:end]に制限します。

構文
以下はrindex()メソッドの構文です-

str.rindex(str, beg=0 end=len(string))

パラメータ
str-検索する文字列を指定します。

beg-これは開始インデックスで、デフォルトでは0です

len-これは終了インデックスであり、デフォルトでは文字列の長さに等しい。

戻り値
このメソッドは、見つかった場合は最後のインデックスを返し、そうでない場合はstrが見つからない場合は例外を発生させます。


次の例は、rindex()メソッドの使用法を示しています。

ライブデモ

!/ usr / bin / python

str1 = "this is string example....wow!!!";
str2 = "is";

print str1.rindex(str2)
print str1.index(str2)

上記のプログラムを実行すると、次の結果が生成されます-

5
2

参照:Python文字列rindex()メソッド-Tutorialspoint

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.