पायथन में रेगुलर एक्सप्रेशन की लालच को सीमित करना

रेगुलर एक्सप्रेशन डिफ़ॉल्ट रूप से लालची होते हैं। इसका मतलब है कि वे अधिकतम संभव वर्णों को कैप्चर करते हैं। आइए एक उदाहरण से समझते हैं। मान लीजिए कि हमारे पास ऐसी स्ट्रिंग है:

pythontxt = 'aeeex zzz x kkk'

इस स्ट्रिंग में हम सबस्ट्रिंग 'aeeex' को निम्नलिखित पैटर्न के अनुसार ढूंढना चाहते हैं: अक्षर 'a', फिर कोई भी वर्ण एक या अधिक बार, फिर अक्षर 'x':

pythonres = re.sub('a.+x', '!', txt)
print(res)

हालांकि हमें स्ट्रिंग '! zzz x kkk' प्राप्त करनी है, स्ट्रिंग '! kkk' प्रिंट होगी। इसका कारण यह है कि हमारा रेगुलर एक्सप्रेशन अक्षर 'a' से अक्षर 'x' तक के सभी वर्ण ढूंढता है। लेकिन हमारी स्ट्रिंग में दो अक्षर 'x' हैं! लालच के कारण ऐसा होता है कि रेगुलर एक्सप्रेशन आखिरी 'x' तक ढूंढता है, जिससे वह अतिरिक्त वर्ण कैप्चर कर लेता है जिसकी हमें आवश्यकता नहीं थी।

निस्संदेह, अक्सर ऐसा व्यवहार हमें ही चाहिए होता है। लेकिन इस विशेष मामले में हमें लालच को रद्द करना होगा और रेगुलर एक्सप्रेशन को बताना होगा, कि वह पहले 'x' तक ही ढूंढे। इस मामले में रिपीटिशन ऑपरेटर के बाद प्रश्न चिह्न लगाना चाहिए:

pythonres = re.sub('a.+?x', '!', txt)
print(res) # स्ट्रिंग '! zzz x kkk' प्रिंट करेगा

लालच को सभी रिपीटिशन ऑपरेटरों के लिए सीमित किया जा सकता है: *, और ?, और {} - इस तरह: *?, ?? और {}?।

Задание 1

एक स्ट्रिंग दी गई है:

pythontxt = 'aba accca azzza wwwwa'

एक रेगुलर एक्सप्रेशन लिखें, जो सभी स्ट्रिंग्स ढूंढे जिनके किनारों पर अक्षर 'a' हों, और उनमें से प्रत्येक को '!' से बदल दे। अक्षरों 'a' के बीच कोई भी वर्ण ('a' के अलावा) हो सकता है।