Tìm chỉ mục xuất hiện lần cuối của chuỗi con trong chuỗi


347

Tôi muốn tìm vị trí (hoặc chỉ mục) của lần xuất hiện cuối cùng của một chuỗi con nhất định trong chuỗi đầu vào đã cho str.

Ví dụ: giả sử chuỗi đầu vào là str = 'hello'và chuỗi con là target = 'l', thì nó sẽ xuất 3.

Tôi có thể làm cái này như thế nào?

Câu trả lời:


600

Sử dụng .rfind():

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

Cũng không sử dụng strlàm tên biến hoặc bạn sẽ phủ bóng tích hợp str().


7
+1 cho mẹo không sử dụng strlàm tên biến. Một tên biến khác mà mọi người nên tránh trong python là abc; có một mô-đun được gọi abctrong API gốc.
progyammer

80

Bạn có thể sử dụng rfind()hoặc liên kết 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

Sự khác biệt là khi không tìm thấy chuỗi con, rfind()trả về -1trong khi rindex()tăng ngoại lệ ValueError(liên kết Python2 :) ValueError.

Nếu bạn không muốn kiểm tra rfind()mã trả về -1, bạn có thể muốn rindex()cung cấp một thông báo lỗi dễ hiểu. Khác bạn có thể tìm kiếm trong vài phút mà giá trị bất ngờ -1đến từ trong mã của bạn ...


Ví dụ: Tìm kiếm ký tự dòng mới nhất

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

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

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

Xin chào @JacobSchneider. Tôi đã thêm một ví dụ theo nhận xét của bạn. Tôi không hiểu vấn đề của bạn. Vui lòng cung cấp thêm thông tin: Phiên bản Python, Nội dung chuỗi của bạn ... Chúc mừng
olibre

39

Sử dụng str.rindexphương pháp.

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

5

Thử cái này:

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

3

Các more_itertoolsthư viện cung cấp các công cụ cho việc tìm kiếm các chỉ số của tất cả các nhân vật hoặc tất cả các chuỗi con .

Được

import more_itertools as mit


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

Nhân vật

Bây giờ có rlocatecông cụ có sẵn:

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

Một công cụ bổ sung là locate:

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

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

Chất nền

Ngoài ra còn có một window_sizetham số có sẵn để định vị mục hàng đầu của một số mục:

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

Không cố gắng phục hồi một bài viết không hoạt động, nhưng vì bài này chưa được đăng ...

(Đây là cách tôi đã làm nó trước khi tìm thấy câu hỏi này)

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

Giải thích: Khi bạn đang tìm kiếm lần xuất hiện cuối cùng, thực sự bạn đang tìm kiếm lần xuất hiện đầu tiên trong chuỗi đảo ngược. Biết điều này, tôi đã làm s[::-1](trả về một chuỗi đảo ngược), và sau đó lập chỉ mục targettừ đó. Sau đó, tôi đã làm len(s) - 1 - the index foundbởi vì chúng tôi muốn chỉ mục trong chuỗi không đảo ngược (tức là bản gốc).

Xem ra, mặc dù! Nếu targetcó nhiều hơn một ký tự, có lẽ bạn sẽ không tìm thấy nó trong chuỗi đảo ngược. Để khắc phục điều này, hãy sử dụng last_pos = len(s) - 1 - s[::-1].index(target[::-1]), tìm kiếm phiên bản đảo ngược của target.


1
Tôi ủng hộ câu trả lời này bởi vì, mặc dù không quá hữu ích cho câu hỏi ban đầu, nhưng nó rất thú vị và mang tính giáo dục nói chung. Tôi nghĩ rằng phần lớn việc học Python là như thế này.
Bill Evans tại Mariposa

@BillEvansatMariposa cảm ơn :)
Adi219

1

Nếu bạn không muốn sử dụng rfind thì điều này sẽ thực hiện mẹo /

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

bạn có thể sử dụng rindex()hàm để có lần xuất hiện cuối cùng của một ký tự trong chuỗi

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

0

Phương thức chuỗi Python rindex ()

Mô tả
Phương thức chuỗi Python rindex () trả về chỉ mục cuối cùng trong đó chuỗi chuỗi con được tìm thấy hoặc đưa ra một ngoại lệ nếu không có chỉ mục đó tồn tại, tùy chọn hạn chế tìm kiếm thành chuỗi [beg: end].

Cú pháp
Sau đây là cú pháp của phương thức rindex () -

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

Tham số
str - Cái này chỉ định chuỗi cần tìm.

ăn xin - Đây là chỉ số bắt đầu, theo mặc định là 0

len - Đây là chỉ mục kết thúc, theo mặc định, nó bằng với độ dài của chuỗi.

Giá trị
trả về Phương thức này trả về chỉ mục cuối cùng nếu tìm thấy khác làm tăng ngoại lệ nếu không tìm thấy str.

Ví dụ Ví dụ
sau đây cho thấy việc sử dụng phương thức rindex ().

Bản thử trực tiếp

! / usr / bin / trăn

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

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

Khi chúng tôi chạy chương trình trên, nó tạo ra kết quả như sau -

5
2

Tham chiếu: Phương thức Python String rindex () - Tutorialspoint

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.