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”之后的那个。
答案 0 :(得分:11)
使用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 :(得分: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
希望这有帮助
答案 2 :(得分:1)
怎么样?
return string.index('Total Cost:') + string[string.index('Total Cost:'):].index('$')
OR
i = string.index('Total Cost:')
return i + string[i:].index('$')