【问题标题】:A quick way to find the first and last indexes of a substring查找子字符串的第一个和最后一个索引的快速方法
【发布时间】:2014-03-18 08:37:54
【问题描述】:

是否有自动查找字符串的第一个和最后一个索引的函数?我想在不压缩两个索引的情况下进行一次查找。

下面的代码在字符串 'txt' 中查找单词 'best' 的第一个和最后一个索引,但是,它是分开进行的。

>>> _txt='my best friend'
>>> _str='best'

>>> _txt.find(_str)  # first index
3

>>> _txt.find(_str[-1]) # last index 
6

#Attempt on joining 
1) >>>_txt.find(_str),(_str[-1])
(3, 't')

尝试的输出是错误的。

理想输出:

(3,6)

有什么建议吗?

【问题讨论】:

  • 我想你想做_txt.find(_str),_txt.find(_str[-1]),你为什么不直接定义一个带有两个参数的函数或lambda?
  • 如果输入的是the best friend怎么办?
  • _txt.find(_str[-1]) 不会像您认为的那样做。在_txt中找到_str的最后一个字符的第一个索引;如果_txt'aabb' 并且_str'abb',这将给出2,而不是3。
  • @EdChum,thefoutheye 刚刚提出了一个非常重要的观察结果。如果输入是“最好的朋友”,您的建议将不起作用
  • 你可以使用正则表达式:试试这个链接stackoverflow.com/questions/8045122/…

标签: python string indexing


【解决方案1】:

如果只有一个匹配,那么你可以这样做:

start = _txt.find(_str)
end = start + len(_str) - 1

或者,如果有多个匹配项,那么您可以使用re.finditer

matches = [(m.start(0), m.end(0) - 1) for m in re.finditer(_str, _txt)]

【讨论】:

  • 我得到的是 [(4, 8)] 而不是 [(4, 7)]。末端工作不正常。
【解决方案2】:

试试这个:

_str ='My best friend.'
getIndexes = lambda x: (_str.find(x[:-len(x)+1]),_str.find(x[len(x)-1:]))
print getIndexes('best')

您无法比使用 lambda 函数并在本地检索子字符串的索引更快。

【讨论】:

  • 你刚刚得到 (0, len-1)。这不是问题。
  • 还是错了;您只是在搜索“模式”的第一个和最后一个字符,而不是整个内容。
  • "my best t best friend" 给出 (3, 7) 而不是 (9, 12)。 “我最好的朋友”给出 (4, 3)。如果您简化索引,原因可能会更清楚:x[:-len(x)+1] 只是s[0]x[len(x)-1:] 就是 x[-1]。也许你想要x[:-1]x[1:],但这仍然会被打破——“我最好的朋友”会给出 (3, 10)。即使这确实有效,我很确定另一个答案,涉及 one 线性搜索和一些简单的算术,将比涉及 two 的解决方案快很多线性搜索和字符串操作。更重要的是,它是更简单的代码阅读。
  • 我完全理解“tbes”的问题。非常感谢!
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 2020-08-02
  • 2012-04-25
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
相关资源
最近更新 更多