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

Posted

技术标签:

【中文标题】查找字符串中子字符串最后一次出现的索引【英文标题】:Find index of last occurrence of a substring in a string 【发布时间】:2012-03-23 06:28:27 【问题描述】:

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

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

我该怎么做?

【问题讨论】:

【参考方案1】:

使用.rfind():

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

也不要使用str 作为变量名,否则你会隐藏内置的str()

【讨论】:

【参考方案2】:

您可以使用rfind()rindex() Python2 链接:rfind() rindex()

>>> s = 'Hello *** 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 版本、字符串的内容...干杯【参考方案3】:

使用str.rindex 方法。

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

【讨论】:

如果在字符串中找不到单词,这将引发错误。使用 rfind 会更好。【参考方案4】:

试试这个:

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

【讨论】:

【参考方案5】:

不尝试恢复非活动帖子,但由于尚未发布...

(在找到这个问题之前我是这样做的)

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

解释:当您搜索最后一个匹配项时,实际上您是在搜索反转字符串中的第一个匹配项。知道了这一点,我做了s[::-1](它返回一个反转的字符串),然后从那里索引target。然后我做了len(s) - 1 - the index found,因为我们想要unreversed(即原始)字符串中的索引。

不过要小心!如果target 不止一个字符,您可能不会在反向字符串中找到它。要解决此问题,请使用 last_pos = len(s) - 1 - s[::-1].index(target[::-1]),它会搜索 target 的反向版本。

【讨论】:

我赞成这个答案,因为虽然对原始问题没有太大用处,但总的来说它很有趣且具有教育意义。我想很多人学习 Python 的过程都是这样的。【参考方案6】:

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

【讨论】:

【参考方案7】:

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 String rindex() Method - Tutorialspoint

【讨论】:

【参考方案8】:

对于这种情况,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。

【讨论】:

【参考方案9】:

如果您不想使用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

【讨论】:

【参考方案10】:
# 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)

【讨论】:

【参考方案11】:

您可以使用rindex() 函数来获取字符串中字符的最后一次出现

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

【讨论】:

以上是关于查找字符串中子字符串最后一次出现的索引的主要内容,如果未能解决你的问题,请参考以下文章

Java中字符串中子串的查找共有四种方法(indexof())

indexOf()

Java中字符串indexof() 的使用方法

Java中字符串indexof() 的使用方法

Java中字符串indexof() 的使用方法

如何获取某个字符在字符串中的位置