Localizar índice da última ocorrência de uma substring em uma string


347

Quero encontrar a posição (ou índice) da última ocorrência de uma certa substring em uma determinada string de entrada str.

Por exemplo, suponha que a sequência de entrada seja str = 'hello'e a substring seja target = 'l', ela deve gerar 3.

Como posso fazer isso?

Respostas:


600

Use .rfind():

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

Também não use strcomo nome de variável ou você sombreará o built-in str().


7
+1 para a dica não usar strcomo nome de variável. Outro nome de variável que as pessoas devem evitar em python é abc; há um módulo chamado abcna API nativa.
progyammer 28/05/19

80

Você pode usar rfind()ou links do 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

A diferença é que quando a substring não é encontrada, rfind()retorna -1enquanto rindex()gera uma exceção ValueError(link do Python2:) ValueError.

Se você não deseja verificar o rfind()código de retorno -1, pode preferir rindex()que forneça uma mensagem de erro compreensível. Caso contrário, você pode procurar por minutos em que o valor inesperado -1vem do seu código ...


Exemplo: pesquisa do último caractere de nova linha

>>> txt = '''first line
... second line
... third line'''

>>> txt.rfind('\n')
22

>>> txt.rindex('\n')
22

Olá, @JacobSchneider. Eu adicionei um exemplo de acordo com o seu comentário. Eu não entendo seu problema. Por favor, forneça mais informações: versão Python, conteúdo de sua corda ... Felicidades
olibre

39

Use o str.rindexmétodo

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

5

Tente o seguinte:

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

3

A more_itertoolsbiblioteca oferece ferramentas para encontrar índices de todos os caracteres ou todas as substrings .

Dado

import more_itertools as mit


s = "hello"
pred = lambda x: x == "l"

Código

Personagens

Agora existe a rlocateferramenta disponível:

next(mit.rlocate(s, pred))
# 3

Uma ferramenta complementar é locate:

list(mit.locate(s, pred))[-1]
# 3

mit.last(mit.locate(s, pred))
# 3

Substrings

Há também um window_sizeparâmetro disponível para localizar o item principal de vários itens:

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

Não estou tentando ressuscitar uma postagem inativa, mas como ela ainda não foi publicada ...

(Foi assim que fiz antes de encontrar esta pergunta)

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

Explicação: Ao pesquisar a última ocorrência, na verdade você está pesquisando a primeira ocorrência na sequência invertida. Sabendo disso, fiz s[::-1](que retorna uma string invertida) e depois indexei o targetde lá. Então eu fiz, len(s) - 1 - the index foundporque queremos que o índice seja revertido (ou seja, original).

Cuidado, porém! Se targethouver mais de um caractere, você provavelmente não o encontrará na string invertida. Para corrigir isso, use last_pos = len(s) - 1 - s[::-1].index(target[::-1]), que procura uma versão invertida de target.


11
Votei positivamente esta resposta porque, embora não fosse muito útil para a pergunta original, era interessante e educacional em geral. Eu acho que muito do aprendizado de Python é assim.
Bill Evans em Mariposa

@BillEvansatMariposa thanks :)
Adi219

1

Se você não quiser usar o rfind , isso fará o truque /

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

você pode usar rindex()function para obter a última ocorrência de um caractere na string

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

0

Método rindex () da cadeia de caracteres Python

Descrição O
método de string Python rindex () retorna o último índice em que a substring str é encontrada ou gera uma exceção se esse índice não existir, restringindo opcionalmente a pesquisa à string [beg: end].

Sintaxe A
seguir, é apresentada a sintaxe do método rindex () -

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

Parâmetros
str - especifica a sequência a ser pesquisada.

beg - Este é o índice inicial, por padrão é 0

len - Este é o índice final, por padrão é igual ao comprimento da string.

Valor de retorno
Este método retorna o último índice, se encontrado, gera uma exceção se str não for encontrado.

Exemplo
O exemplo a seguir mostra o uso do método rindex ().

Demonstração ao vivo

! / usr / bin / python

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

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

Quando executamos o programa acima, ele produz o seguinte resultado -

5
2

Ref: Método Python String rindex () - Tutorialspoint

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.