有人告诉我写一个过程来查找字符串中子字符串的最后位置。似乎正在输出错误信息,我不确定哪里出了问题。
有人可以帮忙吗?
def find_last(s, c):
last_position = -1
while s.find(c) != -1:
last_position = s.find(c)
s = s[last_position + len(c):]
return last_position
print(find_last('aaaa', 'a')) # returns 0, but the last position is 3
答案 0 :(得分:2)
每次调用s.find()
时,您只是在上一场比赛之后使用子字符串。因此,last_position
不会是原始字符串中的位置,而是该子字符串中的位置。
例如,如果使用更复杂的字符串,则更容易看到正在发生的情况。
find_last('abcaxya34', 'a')
第一次通过循环s = 'abcaxya34'
,它在索引a
处找到0
。然后从字符串开头删除该匹配项。
第二遍循环s = 'bcaxya34'
,它在索引a
处找到3
。然后从字符串开头删除该匹配项。
第三遍循环s = 'xya34'
,它在索引a
处找到3
。然后从字符串开头删除该匹配项。
第四遍循环,s = '34'
。这次找不到a
,因此循环结束。然后,它返回上一次迭代的位置3
。但这只是最后一个成功子字符串中的索引,而不是原始字符串中的索引。
str.find()
允许您提供一个可选的起始索引,您可以使用该索引来代替每次对字符串进行切片。
def find_last(s, c):
last_position = 0
result = -1
while True:
next_position = s.find(c, last_position)
if next_position == -1:
break
result = next_position
last_position = next_position + len(c)
return result
答案 1 :(得分:1)
您可以使用rfind()
来获取最后一个字符的位置。
答案 2 :(得分:0)
尝试(从右到左扫描)
def find_last(s, c):
for x in range(len(s)-1, 0, -1):
if s[x] == c:
return x
return -1
答案 3 :(得分:0)
您可以进行简单的for循环。 如果仅键入s.find(c),它将在c中看到第一个s,这意味着如果您添加count = 0,则return将现在为0,并且每当s在c中加1,它将返回该位置。
答案 4 :(得分:0)
颠倒两个字符串:
def find_last(s, c):
pos = s[::-1].find(c[::-1])
if pos != -1:
pos = len(s) - len(c) - pos
return pos