查找字符串中子字符串最后一次出现的索引

我想在给定的输入字符串str中找到某个子字符串的最后一次出现的位置(或索引)。

例如,假设输入字符串是str = 'hello',子字符串是target = 'l',那么它应该输出3。

我该怎么做呢?

516458 次浏览

使用.rfind():

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

另外,不要使用str作为变量名,否则会掩盖内置的str()

使用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'))
你可以使用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

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))

Python String rindex()方法

< p > 描述 < br > Python字符串方法rindex()返回子字符串str所在的最后一个索引,如果不存在这样的索引则引发异常,可选地将搜索限制为字符串[beg:end] < p > 语法 < br > 下面是rindex()方法−

的语法
str.rindex(str, beg=0 end=len(string))
< p > 参数 < br >

. str指定要搜索的字符串

beg−起始索引,默认为0

len -这是结束索引,默认等于字符串的长度。

< p > 返回值 < br > 此方法返回最后一个索引,否则将在str未找到时抛出异常 < p > 例子 < br > 下面的例子显示了rindex()方法的使用

现场演示

! / usr / bin / python

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


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

当我们运行上述程序时,它会产生以下结果−

5
2

Ref: Python String rindex()方法 ——Tutorialspoint < / > < / em > < / p >

# Last Occurrence of a Character in a String without using inbuilt functions
str = input("Enter a string : ")
char = input("Enter a character to serach in string : ")
flag = 0
count = 0
for i in range(len(str)):
if str[i] == char:
flag = i
if flag == 0:
print("Entered character ",char," is not present in string")
else:
print("Character ",char," last occurred at index : ",flag)

在这种情况下,rfind()rindex()字符串方法都可以使用,它们都将返回子字符串所在字符串的最高下标,如下所示。

test_string = 'hello'
target = 'l'
print(test_string.rfind(target))
print(test_string.rindex(target))

但是在使用rindex()方法时应该记住一件事,如果在搜索的字符串中没有找到目标值,rindex ()方法会引发ValueError [substring not found],另一方面rfind()只会返回-1。

str = "Hello, World"
target='l'
print(str.rfind(target) +1)

str = "Hello, World"
flag =0
target='l'
for i,j in enumerate(str[::-1]):
if target == j:
flag = 1
break;
if flag == 1:
print(len(str)-i)