পাইথনে রেগুলার এক্সপ্রেশনে লোভ সীমিত করা
রেগুলার এক্সপ্রেশন ডিফল্টভাবে লোভী। এর মানে হল তারা সর্বাধিক সম্ভাব্য সংখ্যক অক্ষর ধরে নেয়। আসুন একটি উদাহরণ দিয়ে বুঝুন। ধরুন আমাদের নিম্নলিখিত স্ট্রিংটি আছে:
txt = 'aeeex zzz x kkk'
এই স্ট্রিংয়ে আমরা 'aeeex' সাবস্ট্রিংটি খুঁজে পেতে চাই
নিম্নলিখিত প্যাটার্ন অনুসারে:
অক্ষর 'a', তারপর যেকোনো অক্ষর
এক বা একাধিক বার, তারপর অক্ষর 'x':
res = re.sub('a.+x', '!', txt)
print(res)
যদিও আমাদের '! zzz
x kkk' স্ট্রিংটি পাওয়া দরকার, '! kkk' স্ট্রিংটি প্রিন্ট হবে।
সমস্যা হল আমাদের রেগেক্স অক্ষর 'a' থেকে অক্ষর
'x' পর্যন্ত সব অক্ষর খোঁজে। কিন্তু আমাদের স্ট্রিংয়ে দুটি অক্ষর
'x' আছে! লোভের কারণে রেগেক্সটি শেষ 'x' পর্যন্ত
খোঁজে, ফলে এটি আমাদের প্রয়োজনীয় জিনিসটি ধরে না।
নিশ্চয়ই, প্রায়শই এই আচরণই আমাদের দরকার হয়। কিন্তু এই নির্দিষ্ট ক্ষেত্রে আমাদের লোভ বাতিল করতে হবে এবং রেগেক্সটিকে বলতে হবে যে এটি প্রথম 'x' পর্যন্ত খুঁজে পাওয়া উচিত। এই ক্ষেত্রে রিপিটিশন অপারেটরের পরে একটি প্রশ্নবোধক চিহ্ন বসানো উচিত:
res = re.sub('a.+?x', '!', txt)
print(res) # '! zzz x kkk' স্ট্রিংটি প্রিন্ট করবে
সব রিপিটিশন অপারেটরে লোভ সীমিত করা যায়: *, ?, এবং
{} - এভাবে: *?, ??
এবং {}?।
একটি স্ট্রিং দেওয়া আছে:
txt = 'aba accca azzza wwwwa'
একটি রেগুলার এক্সপ্রেশন লিখুন যা
সব স্ট্রিং খুঁজে পাবে যার দুপাশে
'a' অক্ষর আছে, এবং প্রতিটিকে
'!' দিয়ে প্রতিস্থাপন করবে।
'a' অক্ষরের মধ্যে যেকোনো অক্ষর
('a' ছাড়া) থাকতে পারে।