2012-05-13 12 views
11

मैं प्रारूप का एक अजगर स्ट्रिंगएक स्ट्रिंग में सबस्ट्रिंग की स्थिति का पता लगाने

mystr = "hi.this(is?my*string+" 
यहाँ

मैं की 'है' स्थिति प्राप्त करने की आवश्यकता हो रहा है कि विशेष वर्ण या गैर अक्षरात्मक पात्रों से घिरा हुआ है (यानी इस उदाहरण में दूसरा 'है')। हालांकि,

mystr.find('is') 

स्थिति 'अगर' से जुड़ी 'है' जो वांछित नहीं है, तो स्थिति वापस कर देगी। स्ट्रिंग में गैर वर्णमाला वर्णों से घिरा हुआ एक सबस्ट्रिंग की स्थिति कैसे प्राप्त कर सकता हूं? पायथन का उपयोग 2.7

उत्तर

13

यहां सबसे अच्छा विकल्प नियमित अभिव्यक्ति का उपयोग करना है। नियमित अभिव्यक्तियों के साथ काम करने के लिए पायथन में the re module है।

हम एक सरल खोज का उपयोग "is" की स्थिति का पता लगाने के लिए:

>>> match = re.search(r"[^a-zA-Z](is)[^a-zA-Z]", mystr) 

यह एक मैच वस्तु के रूप में पहला मैच देता है।

>>> match.start(1) 
8 

संपादित करें:: हम तो बस प्रारंभिक स्थिति पाने के लिए MatchObject.start() का उपयोग एक अच्छा बनाया बिंदु, हम "is" एक समूह बनाने के लिए और है कि समूह से मेल खाते हैं सुनिश्चित करने के लिए हम सही स्थिति मिलता है।

टिप्पणियों में बताया गया है, यह कुछ अनुमान लगाता है। एक यह है कि घिरा का अर्थ है कि "is" स्ट्रिंग की शुरुआत या अंत में नहीं हो सकता है, यदि ऐसा है, तो एक अलग नियमित अभिव्यक्ति की आवश्यकता होती है, क्योंकि यह केवल तारों से घिरा हुआ है।

दूसरा यह है कि यह विशेष वर्णों के रूप में संख्याओं की गणना करता है - आपने गैर-वर्णमाला कहा है, जिसका अर्थ है कि मैं संख्याओं को शामिल करता हूं। यदि आप संख्याओं को गिनने के लिए नहीं चाहते हैं, तो r"\b(is)\b" का उपयोग सही समाधान है।

+0

आपको वास्तव में इसके लिए '\ b' का उपयोग करना चाहिए। – georg

+0

@ thg435 क्या, क्षमा करें? –

+0

're.search (r '\ bis \ b')' - अन्यथा आप पिछले प्रतीक से मेल खाते हैं और स्थिति गलत है। – georg