Я хочу найти позицию (или индекс) последнего вхождения определенной подстроки в заданную строку str
.
Например, предположим, что введенная строка str = 'hello'
, а подстрока target = 'l'
, тогда она должна выводить 3.
Как я могу это сделать?
Я хочу найти позицию (или индекс) последнего вхождения определенной подстроки в заданную строку str
.
Например, предположим, что введенная строка str = 'hello'
, а подстрока target = 'l'
, тогда она должна выводить 3.
Как я могу это сделать?
Используйте .rfind()
:
>>> s = 'hello'
>>> s.rfind('l')
3
Также не используйте str
как имя переменной или вы будете скрывать встроенный str()
.
Вы можете использовать rfind()
или rindex()
Python2 links: [TG42] [TG43]
>>> s = 'Hello Qaru 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
Используйте метод str.rindex
.
>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2
Попробуйте следующее:
s = 'hello plombier pantin'
print (s.find('p'))
6
print (s.index('p'))
6
print (s.rindex('p'))
15
print (s.rfind('p'))
Библиотека 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
Если вы не хотите использовать 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
Не пытается воскресить неактивное сообщение, но так как оно еще не было опубликовано...
(Вот как я это сделал, прежде чем нашел этот вопрос)
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
.
Вы можете использовать функцию rindex()
, чтобы получить последнее вхождение символа в строку
s="hellloooloo"
b='l'
print(s.rindex(b))