2012-11-01 15 views
5

Python'daki dizeler, dizginizdeki "somestring" için dizin numarasını döndüren bir bulma ("somestring") yöntemine sahiptir.Python'da başka bir alt dizeden sonra oluşan bir alt dizenin ilk oluşumunu nasıl bulabilirim?

Ama ben aşağıdaki gibi bir dize var diyelim:

"5 $ 7 $ 9 $ Toplam Maliyet: $ 35 $ 14"

Ve '$' ilk geçtiği dizinini bulmak istediğiniz oluşur "Toplam Maliyet" dizesinden sonra - python'a söyleyebilmeyi, "Toplam Maliyet" için indeks numarasından başlayarak "$" değerini aramayı ve indeks numarasını (tüm dizgeye göre) döndürmeyi istiyorum) bulduğunuz '$' nin ilk ortaya çıkışı için. Find() yöntemi 0 döndürür ve bu durumda rfind() işe yaramaz.

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) 

Ama bunu yapmak için daha kolay bir yolu olmalı gibi görünüyor ve orada farz muhtemelen ve ben sadece bilmiyorum: Bunu yapmak için kludgy yolu

Bir tür şudur ne olduğunu. Düşünceler?

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

ve doğal olarak "endingSubstr" "startingSubstr" sonra gerçekleşir biri olmak istiyorum: Kendimi bu yapıyoruz bulduğunda

Bu, dilimleme için ozellıkle faydalı olacaktır.

+0

Sen normal ifade kullanmalıdır. Ayrıca, gerçekten $ 'nin yerleştirilmesine mi ihtiyacınız var, yoksa sadece para miktarını öğrenmeye mi ihtiyacınız var? – lolopop

+0

Biraz regex yapıyorum n00b - bunu nasıl regex ile yapabilirim? – CQP

+0

Yine, neye ihtiyacınız var? – lolopop

cevap

11

kullanın İsteğe bağlı ikinci str.find argüman olur regexps kullanın. Eğer daha sonra tekrar okumak kodun ne yaptığını anlamak için sık sık çok zor çünkü

Ben regexp'ler bir " Gerçekten ihtiyacım yok için" yaklaşımı öneriyoruz. Ayrıca çoğu durumda, regexp olmadan aynı şeyi yapabilir ve pazarlıkta okunması kolay olan kodu alabilirsiniz. Karşılaştırma:

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 
+0

Teşekkürler, bu tam olarak istediğim şey ... str.find'in 2. argümanı için – CQP

+0

+1. Muhtemelen re için 're.escape' içine atmak isteyebilirsiniz.search' (özellikle bu örnekte '$' kullandığı için) –

+1

@Jon Evet, aynı sonuca vardım. Ayrıca açgözlü olmayan bir değiştirici kullanmak için ''. –

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 (daha verimli):

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

Veya pythonm anlaşılacağı gibi, şunları yapabilirsiniz:

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 

Umut bu

1

buna ne dersiniz?

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

VEYA

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