2012-11-01 5 views
5

पायथन में स्ट्रिंग्स में एक खोज ("somestring") विधि है जो आपकी स्ट्रिंग में "somestring" के लिए इंडेक्स नंबर देता है।पायथन में एक और सबस्ट्रिंग के बाद होने वाली एक सबस्ट्रिंग की पहली घटना मुझे कैसे मिल सकती है?

लेकिन मान लीजिए कि मैं जैसे निम्नलिखित एक स्ट्रिंग डालते हैं:

"$ 5 $ 7 $ 9 कुल लागत: $ 35 $ 14"

और मैं '$' की पहली आवृत्ति के सूचकांक पता लगाना चाहते हैं कि तब होता है स्ट्रिंग "कुल लागत" के बाद - मैं पाइथन को बताने में सक्षम होना चाहता हूं, "कुल लागत" के लिए सूचकांक संख्या से शुरू होने वाले '$' की खोज करना चाहता हूं, और सूचकांक संख्या (संपूर्ण स्ट्रिंग के सापेक्ष)) आपको मिलने वाली '$' की पहली घटना के लिए। खोज() विधि 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) 

लेकिन ऐसा लगता है वहाँ यह करने के लिए एक आसान तरीका होना चाहिए, और मैं वहाँ मान शायद है और मैं बस पता नहीं है: यह करने के लिए kludgy रास्ते से

एक तरह पीछा कर रहा है यह क्या है। विचार?

यह टुकड़ा करने की क्रिया के लिए विशेष रूप से उपयोगी होगा, जब मैं अपने आप को यह एक बहुत कुछ कर पाते हैं:

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

और स्वाभाविक रूप से मैं "endingSubstr" एक "startingSubstr" के बाद आती है होना चाहता हूँ।

+0

आप regex का उपयोग करना चाहिए। साथ ही, क्या आपको वास्तव में $ की नियुक्ति की आवश्यकता है, या सिर्फ धन की राशि जानने की आवश्यकता है? – lolopop

+0

मैं एक regex n00b का थोड़ा सा हूँ - मैं regexes के साथ यह कैसे करूँ? – CQP

+0

फिर, आपको क्या चाहिए? – lolopop

उत्तर

11

उपयोग str.find की वैकल्पिक दूसरा तर्क:

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

या, pythonm के रूप में पता चलता है, आप कर सकते हैं regexps का उपयोग करें।

मैं, regexps के लिए एक " को मैं वास्तव में जरूरत है" दृष्टिकोण की सलाह देते हैं यह समझना हमेशा क्या जब आप इसे बाद में दोबारा पढ़ने कोड करता है तो मुश्किल है क्योंकि। इसके अलावा मुझे पता चला है कि ज्यादातर मामलों में आप 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 
+0

धन्यवाद, यह वही है जो मैं चाहता था ... – CQP

+0

+1 'str.find' के लिए +1 दूसरा तर्क। शायद 're.escape' में' re के लिए फेंकना चाहते हैं।खोज' (विशेष रूप से उदाहरण '$ 'का उपयोग कर रहा है) –

+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 

आशा इस मदद करता है

1

इस बारे में कैसे?

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

या

i = string.index('Total Cost:') 
return i + string[i:].index('$') 
संबंधित मुद्दे