【问题标题】:find() function in python2.7.5python2.7.5中的find()函数
【发布时间】:2013-11-23 05:53:32
【问题描述】:

find('asdf','')'asdf' 中找到一个空字符串,因此它返回0。 同样,find('asdf','',3) 开始在索引位置3 处搜索字符串,因此返回3。 由于最后一个索引是3,所以find('asdf','',4) 应该返回-1,但它返回4,并且只有在起始索引大于或等于(last_index)+2 时才开始返回-1。为什么会这样?

【问题讨论】:

  • Find method with empty string 的可能重复项
  • 我不认为这是 stackoverflow.com/questions/10392054/… 的副本实际上这个问题显示的行为与我的问题完全相反。
  • 那个问题的答案就是你的问题的答案,即:“最后一个位置是字符串的最后一个字符之后”
  • @BrenBam 是的,我读到了,但问题是如果我先执行 k='asdf',然后在字符串的最后一个索引之后执行 k[4],则会出现超出范围的错误。
  • 试试k[4:4]。由于您正在搜索零长度字符串,因此您应该采用零长度切片。

标签: python python-2.7


【解决方案1】:

因为没有前四个字符的"asdf" 仍然包含""。当索引超过字符串的长度,但索引等于字符串的长度等于"".find()时,更难的检查开始发挥作用。

【讨论】:

  • 如果我需要找出某个子字符串出现的索引位置,并将父字符串和空字符串发送到我的用户定义函数,它返回的索引位置比它应该多一个。在这种情况下,我是否需要专门检查空字符串,并且真的无法通过 find 函数获得正确答案的一般方法?
  • 另一个问题,我不太了解''.find() 方法。我对python很陌生。没有 4 个字符的 'asdf' 中仍然有一个 '' 但在第 5 个索引位置之后没有 '' 是怎么回事? “硬检查”是什么意思?
【解决方案2】:

这是它的工作原理:

0 a 1 s 2 d 3 f 4

当您使用'asdf'.find(sub) 时,它会搜索这五个位置,分别标记为 0、1、2、3 和 4。这五个位置。那五个。不多也不少。它返回第一个'asdf'[pos:pos+len(sub)] == sub。如果您将start 参数包含到find,它将从该位置开始。那个位置。一个也不少,一个也不多。如果您给出的起始位置大于位置列表中的最大数字,则返回 -1。

换句话说,答案是我已经在评论中重复的内容,引用了另一个问题的答案:

[find] 的最后一个位置是字符串的最后一个字符之后

编辑:您的基本误解似乎与字符串中“位置”的概念有关。 find 不会返回您希望作为单个单位访问的职位。即使它返回 4,这并不意味着空字符串是“在”位置 4。find 返回 切片开始。您应该从给定位置开始切片字符串。

所以当你执行'asdf'.find('', 4) 时,它从位置4 开始。它在那里找到空字符串,因为'asdf'[4:4+len('')]==''。它返回 4。这就是它的工作原理。

str.find 并不打算在有效索引到实际字符串之间进行一对一的映射。是的,你可以做很多其他的索引,比如'asdf'[100:300]。这与find 无关。你从find 知道的是'asdf'[pos:pos+len(sub)] == sub。您不知道返回 '' 的每个可能的索引都将由 find 返回,如果您搜索空字符串,您也不能保证 find 返回的数字是该字符串的有效索引。

如果您对此功能的某些使用有实际问题,请继续将其作为单独的问题提出。但是您似乎已经知道find 的工作原理,所以不清楚您希望从这个问题中获得什么。

【讨论】:

  • 感谢您提供详细信息。 0 a 1 s 2 d 3 f 4 你的意思是 '' 在这种情况下映射到位置 4 吗?如果是这样,为什么 str[4] 会给出超出范围的错误?
  • @astel23:请重新阅读我的回答。没有什么“在”位置 4。Find 只关心 slices
  • 感谢您的编辑。即使您的 bolded 部分不在您的 Edit 块内,我相信您已经更改了它。你以前的回答说最后一个位置是在字符串的最后一个字符之后,这是我困惑的原因。您能否向我解释一下 find 返回切片开始的含义。您应该从给定位置开始对字符串进行切片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2014-11-13
  • 2016-03-21
  • 2016-11-22
  • 2021-11-06
  • 1970-01-01
相关资源
最近更新 更多