Найти индекс последнего появления подстроки в строке - PullRequest
262 голосов
/ 05 марта 2012

Я хочу найти позицию (или индекс) последнего вхождения определенной подстроки в заданной введенной строке str.

Например, предположим, что введенная строка - str = 'hello', а подстрока - target = 'l', тогда она должна вывести 3.

Как я могу это сделать?

Ответы [ 7 ]

475 голосов
/ 05 марта 2012

Использование .rfind():

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

Также не используйте str в качестве имени переменной, иначе вы будете скрывать встроенную str().

66 голосов
/ 14 ноября 2014

Вы можете использовать rfind() или rindex()
Python2: 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
35 голосов
/ 05 марта 2012

Используйте метод str.rindex.

>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2
3 голосов
/ 09 февраля 2018

Библиотека 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
3 голосов
/ 13 октября 2014

Попробуйте это:

s = 'hello plombier pantin'
print (s.find('p'))
6
print (s.index('p'))
6
print (s.rindex('p'))
15
print (s.rfind('p'))
1 голос
/ 07 апреля 2018

Не пытается воскресить неактивное сообщение, но так как оно еще не было опубликовано ...

(Вот как я это сделал, прежде чем нашел этот вопрос)

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

Объяснение: Когда вы ищете последнее вхождение, вы действительно ищете первое вхождение в обратной строке. Зная это, я сделал s[::-1] (который возвращает обратную строку), а затем проиндексировал target оттуда. Затем я сделал len(s) - 1 - the index found, потому что мы хотим, чтобы индекс в необратимой (т.е. оригинальной) строке.

Берегись, хотя! Если target больше чем один символ, вы, вероятно, не найдете его в обратной строке. Чтобы исправить это, используйте last_pos = len(s) - 1 - s[::-1].index(target[::-1]), который ищет обратную версию target.

1 голос
/ 23 февраля 2018

Если вы не хотите использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...