2012-11-01 5 views
5

Strings in Python haben eine Find ("Somestring") -Methode, die die Indexnummer für "Somestring" in Ihrer Zeichenfolge zurückgibt.Wie kann ich das erste Vorkommen eines Teilstrings nach einem anderen Teilstring in Python finden?

Aber lassen Sie uns sagen, ich habe eine Zeichenfolge wie folgt aus:

„$ 5 $ 7 $ 9 Gesamtkosten: $ 35 $ 14“

Und ich möchte den Index des ersten Auftretens von ‚$‘ zu finden, der auftritt, nach die Zeichenfolge "Gesamtkosten" - Ich würde gerne in der Lage sein, Python zu sagen, nach '$' zu suchen, beginnend mit der Indexnummer für "Gesamtkosten", und die Indexnummer zurückgeben (relativ zur gesamten Zeichenfolge)) für das erste Vorkommen von '$', das Sie finden. Die Methode find() würde 0 zurückgeben und rfind() würde auch in diesem Fall nicht funktionieren.

Eine Art von kludgy Weg, dies zu tun, ist die folgende:

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) 

Aber es scheint, wie es sollte ein einfacher Weg, dies zu tun, und ich nehme an, es wahrscheinlich ist, und ich weiß nur nicht, was es ist. Gedanken?

wäre dies zum Schneiden nützlich Insbesondere dann, wenn ich mir diese viel zu tun finden:

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

und ich mag natürlich die „endingSubstr“ derjenige sein, der nach dem „startingSubstr“ auftritt.

+0

Sie sollten regex verwenden. Brauchen Sie wirklich die Platzierung des $ oder müssen Sie nur den Geldbetrag herausfinden? – lolopop

+0

Ich bin ein bisschen wie ein Regex n00b - wie mache ich das mit Regexes? – CQP

+0

Noch einmal, was brauchst du? – lolopop

Antwort

11

Verwenden Sie das optionale zweite Argument von str.find:

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

Oder, wie pythonm schon sagt, können Sie Verwenden Sie Regexps.

Ich empfehle einen „do ich wirklich- brauche“ -Ansatz, um regexps, weil es oft so schwer zu verstehen, was der Code macht, wenn Sie es später noch einmal lesen. Auch habe ich festgestellt, dass Sie in den meisten Fällen das Gleiche ohne Regexp machen können, und Code erhalten, der leichter zu lesen ist. Vergleichen Sie:

+0

Danke, das ist genau das, was ich wollte ... – CQP

+0

+1 für 'str.find' 2. Argument. Wahrscheinlich wollen Sie dort "re.escape" hineinwerfen.Suche "(besonders da das Beispiel' $ 'verwendet) –

+1

@Jon Ja, ich kam zu dem gleichen Schluss. Ich brauchte auch einen nicht-gierigen Modifikator für '. *'. –

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 

OR (effizienter):

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 

Hoffnung hilft diese

1

Wie wäre es damit?

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

ODER

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