6

Python の文字列には、文字列内の「somestring」のインデックス番号を返す find("somestring") メソッドがあります。

しかし、次のような文字列があるとしましょう。

"$5 $7 $9 総費用: $35 $14"

そして、文字列 "Total Cost" の後に発生する "$" の最初の出現のインデックスを見つけたいです。Python に、" Total Cost" を検索し、最初に見つかった '$' のインデックス番号 (文字列全体に対する) を返します。この場合、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

オプションの2番目の引数を使用します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 に答える