Python 3:获取字符串中倒数第二个出现位置的索引

17

我有一个字符串 abcdabababcebc,如何获取字符 b 第二次出现的位置?我查找到了 rfind() 方法,但由于它返回的是最后一个匹配项的索引,而不是倒数第二个,所以无法使用。

我正在使用 Python 3。


2
我不明白为什么这个被踩了。 - MAK
你是否查看了str.rfind的所有三个参数,或者阅读了描述?这并没有解释为什么会被踩(我不知道是谁踩的或为什么);我很好奇你在哪里“搜索并找到rfind()”没有那些信息,因为它真的应该被修复。 - abarnert
3个回答

19

这里是一种方法:

>>> def find_second_last(text, pattern):
...   return text.rfind(pattern, 0, text.rfind(pattern))
... 
>>> find_second_last("abracadabra", "a")
7

使用可选的起始和结束参数,在找到第一个匹配项后查找第二个匹配项。

注意:此操作不进行任何合理性检查,如果文本中没有至少2个模式出现,则会崩溃。


1
+1,因为我认为这比复制大部分字符串只为搜索副本要好(在需要的情况下)。 - abarnert

11

列举所有索引,选择您想要的那一个。

In [19]: mystr = "abcdabababcebc"

In [20]: inds = [i for i,c in enumerate(mystr) if c=='b']

In [21]: inds
Out[21]: [1, 5, 7, 9, 12]

In [22]: inds[-2]
Out[22]: 9

+1 是因为它非常灵活(例如,如果您想要查找倒数第N个呢?),而且它的工作原理非常明显。当然,如果 mystr 很大并且/或者有很多副本的 'b',那么这不是一个好的解决方案(在这种情况下,请参见MAK的解决方案),但通常这并不重要。 - abarnert
@abarnert:是的,最坏情况下确实会使用线性空间。 - inspectorG4dget
@AshwiniChaudhary:这是更高的空间复杂度。 - inspectorG4dget
如果可能的话,最好直接在字符串上操作,而不是使用索引,例如rfind、find,有时甚至是re。 - user554538

10
>>> s = "abcdabababcebc"
>>> s[:s.rfind("b")].rfind("b")
9 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接