ค้นหาดัชนีการเกิดขึ้นครั้งสุดท้ายของสตริงย่อยในสตริง


349

ฉันต้องการที่จะหาตำแหน่ง (หรือดัชนี) strของเกิดขึ้นครั้งล่าสุดของสตริงย่อยบางอย่างในสายป้อนให้

ตัวอย่างเช่นสมมติว่าสตริงอินพุตเป็นstr = 'hello'และสตริงย่อยคือtarget = 'l'ดังนั้นมันควรจะส่งออก 3

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


601

การใช้.rfind():

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

นอกจากนี้ยังไม่ได้ใช้เป็นชื่อตัวแปรหรือคุณจะเงาในตัวstrstr()


7
+1 สำหรับเคล็ดลับที่จะไม่ใช้strเป็นชื่อตัวแปร ชื่อตัวแปรอื่นที่ผู้คนควรหลีกเลี่ยงในไพ ธ อนคือabc; มีโมดูลที่เรียกว่าabcใน Native API
progyammer

81

คุณสามารถใช้rfind()หรือลิงค์ 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

ความแตกต่างคือเมื่อย่อยจะไม่พบ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

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

2

ยังไม่พยายามที่จะคืนชีพโพสต์ที่ไม่ได้ใช้งาน แต่เนื่องจากยังไม่ได้โพสต์ ...

(นี่คือวิธีที่ฉันทำก่อนค้นหาคำถามนี้)

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


1
ฉันยกระดับคำตอบนี้เพราะแม้ว่าจะไม่ได้มีประโยชน์สำหรับคำถามต้นฉบับ แต่มันก็น่าสนใจและให้ความรู้โดยทั่วไป ฉันคิดว่าการเรียนรู้เรื่อง Python ของคนส่วนใหญ่เป็นแบบนี้
Bill Evans ที่ Mariposa

1

หากคุณไม่ต้องการใช้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


0

Python String rindex () วิธีการ

คำอธิบาย
Python สตริงเมธอด rindex () ส่งคืนดัชนีล่าสุดที่พบสตริงย่อย str หรือยกข้อยกเว้นหากไม่มีดัชนีดังกล่าวอยู่เลือก จำกัด การค้นหาสตริง [beg: end]

วากยสัมพันธ์
ต่อไปนี้เป็นไวยากรณ์สำหรับวิธี rindex () -

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

พารามิเตอร์
str - นี่ระบุสตริงที่จะค้นหา

beg - นี่คือดัชนีเริ่มต้นโดยค่าเริ่มต้นเป็น 0

len - นี่คือดัชนีสิ้นสุดโดยค่าเริ่มต้นจะเท่ากับความยาวของสตริง

Return Value
เมธอดนี้ส่งคืนดัชนีล่าสุดหากพบมิฉะนั้นจะเพิ่มข้อยกเว้นหากไม่พบ str

ตัวอย่างตัวอย่าง
ต่อไปนี้แสดงให้เห็นถึงการใช้วิธีการ rindex ()

การสาธิตสด

! / usr / bin / หลาม

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

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

เมื่อเรารันโปรแกรมดังกล่าวข้างต้นก็จะสร้างผลลัพธ์ดังต่อไปนี้ -

5
2

Ref: Python String rindex () วิธีการ - Tutorialspoint

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.