Найти индекс последнего появления подстроки в строке


350

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

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

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

Ответы:


604

Используйте .rfind():

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

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


8
+1 за подсказку, чтобы не использовать strв качестве имени переменной. Другое имя переменной, которого люди должны избегать в python, это abc; abcв нативном API есть модуль
прогаммер

81

Вы можете использовать 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это более одного символа, вы, вероятно, не найдете его в обратной строке. Чтобы исправить это, используйте last_pos = len(s) - 1 - s[::-1].index(target[::-1]), который ищет обратную версию target.


1
Я проголосовал за этот ответ, потому что, хотя и не слишком полезный для исходного вопроса, он был интересным и познавательным в целом. Я думаю, что большая часть изучения Python такая же.
Билл Эванс в Mariposa

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

Вы можете использовать rindex()функцию, чтобы получить последнее вхождение символа в строке

s="hellloooloo"
b='l'
print(s.rindex(b))

0

Метод Python String rindex ()

Описание
Метод строки Python rindex () возвращает последний индекс, в котором найдена подстрока str, или вызывает исключение, если такого индекса нет, опционально ограничивая поиск строкой [beg: end].

Синтаксис
Следующий синтаксис для метода rindex () -

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

Параметры
str - указывает строку для поиска.

beg - это начальный индекс, по умолчанию его 0

len - это конечный индекс, по умолчанию он равен длине строки.

Возвращаемое значение
Этот метод возвращает последний индекс, если он найден, в противном случае возникает исключение, если str не найден.

Пример
В следующем примере показано использование метода rindex ().

Live Demo

! / USR / бен / питон

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

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

Когда мы запускаем вышеуказанную программу, она выдает следующий результат -

5
2

Ссылка: Python String Метод rindex () - Учебное пособие

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.