【问题标题】:How can I find the first occurrence of a substring occurring after another substring in python?如何在 python 中找到在另一个子字符串之后出现的子字符串的第一次出现?
【发布时间】:2023-03-15 22:30:01
【问题描述】:

Python 中的字符串有一个 find("somestring") 方法,它返回字符串中“somestring”的索引号。

但是假设我有一个如下字符串:

“$5 $7 $9 总成本:$35 $14”

我想找到在字符串“Total Cost”之后第一次出现'$'的索引——我希望能够告诉python,搜索' $',从“总成本”的索引号开始,并返回您找到的第一次出现的“$”的索引号(相对于整个字符串)。 find() 方法将返回 0,而 rfind() 在这种情况下也不起作用。

一种笨拙的方法如下:

def findStrAfterStr(myString, searchText, afterText):

    splitString = myString.split(afterText)
    myIndex = len(splitString[0]) + len(afterText) + splitString[1].find(searchText)
    return myIndex

myString = "$5   $7    $9     Total Cost: $35   $14"
searchText = "$"
afterText = "Total Cost"

findStrAfterStr(myString, searchText, afterText)

但似乎应该有一种更简单的方法来做到这一点,我认为可能有,但我只是不知道它是什么。想法?

当我发现自己经常这样做时,这对切片特别有用:

myString[myString.find("startingSubstr"):myString.find("endingSubstr")]

当然,我希望“endingSubstr”是出现在“startingSubstr”之后的那个。

【问题讨论】:

  • 你应该使用正则表达式。另外,您真的需要放置美元,还是只需要找出金额?
  • 我有点喜欢正则表达式 n00b -- 我该如何使用正则表达式?
  • 再说一次,你需要什么?
  • 我需要放置 $...
  • 我猜你真正想要的是总成本的价值,在这种情况下re.search(r'Total Cost: \$(\d+)', s).group(1) 做得很好。

标签: python string string-matching


【解决方案1】:

使用str.find的可选第二个参数:

def findStrAfterStr(myString, searchText, afterText):
    after_index = myString.index(afterText)
    return myString.find(searchText, after_index)

或者,正如 pythonm 建议的那样,您可以使用正则表达式。

我建议对正则表达式采用“我是否真的需要”方法,因为当您稍后再次阅读代码时,通常很难理解代码的作用。我还发现,在大多数情况下,您可以在不使用正则表达式的情况下做同样的事情,并获得更容易阅读的代码。比较:

import re

def findStrAfterStr(myString, searchText, afterText):
    pattern = "{0}.*?({1})".format(re.escape(afterText), re.escape(searchText))
    match = re.search(pattern, myString)
    return match.start(1) if match else -1

【讨论】:

  • +1 表示str.find 第二个参数。可能想在re.search 中加入re.escape(特别是因为示例使用$
  • @Jon 是的,我得出了同样的结论。我还需要对.* 使用非贪婪修饰符。
  • 我想我可以在这里使用str.index 而不是str.find。除了str.index 引发ValueError 没有找到子字符串(而不是返回-1 这是一个有效的索引)之外,它们基本上做同样的事情。考虑极端情况:s = 'foo'; i = s.find('b'); print s.find('o',i) 错误地打印 2。
【解决方案2】:
def findStrAfter(myString, searchText, afterText):
    try:
        i = myString.index(afterText)
        return min(i for i,char in enumerate(myString) if myString[i:].startswith(searchText) and i>afterText)
    except ValueError:
        print "'%s' does not exist" %afterText

OR(更有效):

def findStrAfter(myString, searchText, afterText):
    try:
        i = myString.index(afterText)
    except ValueError:
        print "'%s' does not exist" %afterText
        raise
    try:
        return myString[i:].index(searchText)
    except ValueError:
        print "'%s' does not exist after '%s' in myString" %(searchText, afterText)
        raise

希望对你有帮助

【讨论】:

    【解决方案3】:

    这个怎么样?

    return string.index('Total Cost:') + string[string.index('Total Cost:'):].index('$')
    

    i = string.index('Total Cost:')
    return i + string[i:].index('$')
    

    【讨论】:

      猜你喜欢
      • 2011-03-14
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 2015-05-11
      • 2014-12-12
      • 1970-01-01
      相关资源
      最近更新 更多