5

मुझे सभी तारों को ढूंढना है जो केवल अक्षरों 'ए' और 'बी' से बने होते हैं और 'ए' के ​​प्रत्येक उदाहरण को तुरंत 'बी' के बाद और तुरंत 'बी' के बाद किया जाता है। ।regex में वर्णों के साथ 'लुकराउंड' का उपयोग करते समय संपूर्ण स्ट्रिंग को कैप्चर कैसे करें?

उदाहरण के लिए:

mystring = 'bab babab babbab ab baba aba xyz' 

तब मेरे regex लौटना चाहिए:

['bab' 'babab' 'babbab'] 

(स्ट्रिंग 'अब' में - 'एक' से 'बी' के पहले नहीं कर रहा है इसी तरह 'ए.बी.ए.' के लिए और 'xyz' केवल 'एक', 'बी' से बना नहीं है)

मैं इसके लिए अग्रदर्शी का इस्तेमाल किया और इस regex लिखा है:।

re.findall(r'((?<=b)a(?=b))',mystring) 

लेकिन यह केवल मुझे जो पीछा कर रहे हैं 'एक'/की तरह 'बी' से पहले की सभी आवृत्तियों रिटर्न:

['a','a','a','a'] 

लेकिन मैं पूरे शब्द की जरूरत है। रेगेक्स का उपयोग करके मैं पूरे शब्द कैसे ढूंढ सकता हूं? मैंने विभिन्न विकल्पों के साथ अपने regex को संशोधित करने की कोशिश की, लेकिन कुछ भी काम नहीं लगता है। यह कैसे किया जा सकता है?

उत्तर

3

आप रेगुलर एक्सप्रेशन से निम्न का उपयोग कर सकते हैं:

>>> re.findall(r'\b(?:b+a)+b+\b',mystring) 
['bab', 'babab', 'babbab'] 

Regular expression visualization

Debuggex Demo

आप आरेख पूर्ववर्ती से देख सकते हैं इस regex ba के किसी भी संयोजन (जो एक से अधिक समय प्रस्तुत b कर सकते हैं) है, जो शब्द है कि हर a पूवर् म होना b से तो स्ट्रिंग के पूरे एक या द्वारा पीछा किया जा सकता है उत्पादन की भरपाई कर देंगे अधिक b

+0

बहुत धन्यवाद, यह काम करता है। मुझे लगता है कि मुझे परिमित राज्य मशीनों की मेरी समझ में सुधार करना होगा –

0

re.findall(r'(b+ab+)+',mystring); 

का प्रयास करें यदि bbbabb भी अनुमति दी। आपको आगे या पीछे देखने की आवश्यकता नहीं है।

संपादित करें: हाँ, यह भी मैच के लिए babab (दोनों a के लिए एक साझा b) आदि यह होना चाहिए

re.findall(r'(b+a)+b+',mystring); 
+0

धन्यवाद। लेकिन यह तब काम नहीं करता है जब स्ट्रिंग में 'ए' जैसे 'ए' जैसे 'बाबाब', 'बाबाब', 'बाबाब' –

संबंधित मुद्दे