6

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

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

“5 美元 7 美元 9 美元总成本:35 美元 14 美元”

我想找到字符串“总成本”之后第一次出现的“$”的索引——我希望能够告诉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”之后出现的那个。

4

3 回答 3

12

使用可选的第二个参数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
于 2012-11-01T19:18:34.683 回答
3
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

或(更有效):

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

希望这可以帮助

于 2012-11-01T19:13:35.447 回答
1

这个怎么样?

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

或者

i = string.index('Total Cost:')
return i + string[i:].index('$')
于 2012-11-01T19:25:17.350 回答