如何找到python中另一个子字符串后出现的第一个子字符串?

CQP*_*CQP 5 python string string-matching

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)
Run Code Online (Sandbox Code Playgroud)

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

当我发现自己做了很多这样的事情时,这对切片特别有用:

myString[myString.find("startingSubstr"):myString.find("endingSubstr")]
Run Code Online (Sandbox Code Playgroud)

我自然希望"endingSubstr"成为"startingSubstr"之后出现的那个.

Lau*_*low 11

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

def findStrAfterStr(myString, searchText, afterText):
    after_index = myString.index(afterText)
    return myString.find(searchText, after_index)
Run Code Online (Sandbox Code Playgroud)

或者,正如pythonm建议的那样,您可以使用regexp.

我建议使用" 真的需要 "regexp的方法,因为通常很难理解代码在稍后再次阅读时的作用.此外,我发现在大多数情况下,你可以在没有正则表达式的情况下做同样的事情,并获得更便于阅读的代码.相比:

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
Run Code Online (Sandbox Code Playgroud)