Temukan indeks kemunculan substring terakhir dalam string

347

Saya ingin mencari posisi (atau indeks) dari kejadian terakhir dari substring tertentu dalam string input yang diberikan str.

Sebagai contoh, anggaplah string input adalah str = 'hello'dan substringnya target = 'l', maka seharusnya output 3.

Bagaimana saya bisa melakukan ini?

Parth
sumber

Jawaban:

600

Gunakan .rfind():

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

Juga jangan gunakan strsebagai nama variabel atau Anda akan membayangi bawaan str().

Rik Poggi
sumber
7
+1 untuk kiat agar tidak digunakan strsebagai nama variabel. Nama variabel lain yang harus dihindari orang dengan python adalah abc; ada modul yang disebut abcdi API asli.
Progyammer
80

Anda dapat menggunakan tautanrfind() atau 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

Perbedaannya adalah ketika substring tidak ditemukan, rfind()kembali -1sambil rindex()memunculkan pengecualian ValueError(tautan Python2:) ValueError.

Jika Anda tidak ingin memeriksa rfind()kode kembali -1, Anda dapat memilih rindex()yang akan memberikan pesan kesalahan yang bisa dimengerti. Jika tidak, Anda dapat mencari menit dari mana nilai tak terduga -1berasal dari dalam kode Anda ...


Contoh: Pencarian karakter baris baru terakhir

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

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

>>> txt.rindex('\n')
22
olibre
sumber
Hai @JacobSchneider. Saya telah menambahkan contoh sesuai dengan komentar Anda. Saya tidak mengerti masalah Anda. Harap berikan informasi lebih lanjut: Versi Python, Konten string Anda ... Cheers
olibre
39

Gunakan str.rindexmetodenya.

>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2
rmmh
sumber
5

Coba ini:

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

The more_itertoolsmenawarkan perpustakaan alat untuk menemukan indeks dari semua karakter atau semua substring .

Diberikan

import more_itertools as mit


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

Kode

Karakter

Sekarang ada rlocatealat yang tersedia:

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

Alat pelengkap adalah locate:

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

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

Substring

Ada juga window_sizeparameter yang tersedia untuk mencari item utama dari beberapa item:

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
pylang
sumber
2

Tidak mencoba menghidupkan kembali pos yang tidak aktif, tetapi karena ini belum diposting ...

(Ini adalah bagaimana saya melakukannya sebelum menemukan pertanyaan ini)

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

Penjelasan: Ketika Anda mencari kejadian terakhir, benar-benar Anda mencari kejadian pertama dalam string terbalik. Mengetahui hal ini, saya lakukan s[::-1](yang mengembalikan string terbalik), dan kemudian diindeks targetdari sana. Lalu saya lakukan len(s) - 1 - the index foundkarena kami ingin indeks dalam string (yaitu asli) yang tidak dapat dikembalikan .

Hati-hati! Jika targetlebih dari satu karakter, Anda mungkin tidak akan menemukannya di string terbalik. Untuk memperbaikinya, gunakan last_pos = len(s) - 1 - s[::-1].index(target[::-1]), yang mencari versi terbalik dari target.

Adi219
sumber
1
Saya mengangkat jawaban ini karena, meskipun tidak terlalu berguna untuk pertanyaan awal, itu menarik dan mendidik secara umum. Saya pikir banyak dari pembelajaran seseorang tentang Python sama seperti ini.
Bill Evans di Mariposa
@BillEvansatMariposa terima kasih :)
Adi219
1

Jika Anda tidak ingin menggunakan rfind maka ini akan melakukan trik /

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
Salam
sumber
0

Anda dapat menggunakan rindex()fungsi untuk mendapatkan kemunculan karakter terakhir dalam string

s="hellloooloo"
b='l'
print(s.rindex(b))
Praveen Kumar
sumber
0

Metode Python String rindex ()

Deskripsi
Metode string Python rindex () mengembalikan indeks terakhir tempat str substring ditemukan, atau memunculkan pengecualian jika tidak ada indeks seperti itu, secara opsional membatasi pencarian ke string [mohon: akhiri].

Sintaksis
Berikut adalah sintaks untuk metode rindex () -

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

Parameter
str - Ini menentukan string yang akan dicari.

mohon - Ini adalah indeks awal, secara default 0

len - Ini adalah indeks akhir, secara default sama dengan panjang string.

Nilai Pengembalian
Metode ini mengembalikan indeks terakhir jika ditemukan sebaliknya memunculkan pengecualian jika str tidak ditemukan.

Contoh
berikut menunjukkan penggunaan metode rindex ().

Demo Langsung

! / usr / bin / python

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

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

Ketika kami menjalankan program di atas, itu menghasilkan hasil sebagai berikut -

5
2

Ref: Metode Python String rindex () - Tutorialspoint

Wise4Christ
sumber